Почему 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