Почему hasOwnProperty не распознает функции на прототипе объекта?

Я понимаю что hasOwnProperty Метод в JavaScript существует для идентификации свойств только текущего типа, но в цепочке прототипов есть кое-что, что меня смущает.

Давайте представим, что я определяю тип с именем Bob и назначаю две дочерние функции моему типу Bob двумя различными способами:

function Bob()
{
    this.name="Bob"; 
    this.sayGoodbye=function()
    {
        console.log("goodbye");   
    }
}

Bob.prototype.sayHello= function()
{
    console.log("hello");   
}

Теперь помимо доступа к закрытой области в случае sayGoodbyeмне кажется, что обе функции принадлежат Bob класс должен быть более или менее равным. Тем не менее, когда я ищу их с hasOwnProperty они не совпадают с JavaScript:

var myBob = new Bob();
console.log( myBob.name ); // Bob, obviously 
console.log( myBob.hasOwnProperty("sayHello"));  // false
console.log( myBob.hasOwnProperty("sayGoodbye")); // true
console.log( "sayHello" in myBob ); // true

Что здесь происходит с точки зрения масштабов? Я не мог создать экземпляр Bob тип, не имея sayHello() а также sayGoodbye() свойства, связанные с этим, так почему метод-прототип является гражданином второго сорта, насколько hasOwnProperty обеспокоен? Является Bob.prototype тип, который существует как-то независимо от Bob тип, из которого Bob все наследует?

2 ответа

Решение

Я думаю, что вы путаете несколько понятий здесь. Давайте возьмем эту цитату из MDN:

Каждый объект произошел от Object наследует hasOwnProperty метод. Этот метод может использоваться, чтобы определить, имеет ли объект указанное свойство как прямое свойство этого объекта; в отличие от in оператор, этот метод не проверяет цепочку прототипов объекта.

Так что это ключ здесь. Когда вы используете new JavaScript назначит новый объект this и вернуть его, вот что такое экземпляр. Любое свойство, объявленное внутри конструктора, является собственным свойством. Свойства, заявленные на prototype нет, так как они используются совместно с другими экземплярами того же объекта.

И prototype также Object, например:

Bob.prototype.hasOwnProperty("sayHello"); //=> true

myBob.constructor.prototype.hasOwnProperty("sayHello"); //=> true

Я понимаю, что метод hasOwnProperty в JavaScript существует для идентификации свойств только текущего типа

Это не правильно. hasOwnProperty идентифицирует собственные свойства объекта, то есть свойства самого объекта. Он не учитывает унаследованные свойства объекта [[Prototype]] цепь.

например

var foo = {name: 'foo'};

// Check for an own property
foo.hasOwnProperty('name'); // true

Объект foo также наследует метод toString от Object.prototype, но это не "собственное" свойство:

typeof foo.toString             // function
foo.hasOwnProperty('toString'); // false
Другие вопросы по тегам