2016-02-17 2 views
-2

Я пытаюсь понять метод hasOwnProperty(). Я понимаю, что метод проверяет, имеет ли объект собственное свойство с заданным именем в методе. Однако он возвращает false для наследуемых объектов.hasOwnProperty() method

var o = { 
 
    name: 'Master', 
 
    number: '117', 
 
    last: 'Chief' 
 
}; 
 

 
o.prototype = { 
 
    planet: 'Halo' 
 
}; 
 

 
for(var p in o) { 
 
    if(!o.hasOwnProperty(p)) { 
 
    continue; 
 
    } 
 
    console.log(p); 
 
}

Так что, когда я запускаю этот скрипт, консоль возвращает "имя", "количество", "последний", и "прототип" от o.prototype. Может ли кто-нибудь дать мне объяснение, почему сценарий возвращает возвращаемые унаследованные свойства? Я думал, что отрицание метода «hasOwnProperty()» пропустит унаследованные свойства.

+0

Это не печатает «планету», поэтому она делает то, что вы ожидаете. –

+1

Не воспроизводимый. Этот код записывает «имя, номер, последний, прототип», а не «имя, номер, последний, завод». И объект наследует только объект Object.prototype, который не имеет перечислимого свойства (по умолчанию). – Oriol

+1

В [MDN] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) есть статья, которая очень хорошо объясняет этот метод. То, с чем вы сталкиваетесь _actually_, - это концепции, связанные с прототипическим наследием, что очевидно из-за неудачной попытки использования прототипов. Пожалуйста, прочитайте [Работа с объектами] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects) и потратите некоторое время на правильное изучение ООП в JavaScript. – Oka

ответ

-1

Ваш код создает объект и передает его с 3-мя «собственные» свойства:

var o = { 
    name: 'Master', 
    number: '117', 
    last: 'Chief' 
}; 

Затем вы просто создать 4-й с:

o.prototype = { 
    planet: 'Halo' 
}; 

Когда свойство извлекается на объекте, сначала проверяются «собственные» свойства текущего объекта. Если свойство не найдено, цепочка прототипов проверяется - вплоть до Object.prototype. Если свойство не может быть найдено нигде в цепочке прототипов, возвращается undefined.

Если свойство SET установлено, происходит другое поведение. Независимо от того, было ли свойство унаследовано, новое свойство создается как «собственное» свойство для текущего объекта (исключение из этого правила заключается в том, что указанное свойство является свойством accessor).

Прототип, который вы устанавливаете, создает 4-е и конечное свойство, которое вы видите в консоли.

Смежные вопросы