2

MDN состояния:JavaScript Перебор свойств объекта и цепочка прототипов

Кроме того, когда итерация свойств объекта, каждое перечислимы свойство, которое находится на цепочке прототипов будут перечислены.

Так что я попытался это:

var x = {a: "I am a"}; 
var z = Object.create(x); 

for(i in z) 
{ 
    console.dir(i); 

    if(i == "hasOwnProperty") { 
     console.log('found hasOwnProperty'); 
    } 
} 

Выходы только a но не hasOwnProperty. Зачем?

ответ

7

Поскольку Object.prototype.hasOwnProperty не является перечислим:

Object.getOwnPropertyDescriptor(Object.prototype, 'hasOwnProperty') 
    .enumerable // false 

Таким образом, это не итеративно петлей for...in.

+0

Спасибо. Что означает «перечислимый»? Возможно, это было мое недоразумение. –

+0

Свойства @RobertRocha имеют некоторые внутренние флаги: [[Writable]], [[Enumerable]] и [[Configurable]]. Если свойство имеет флаг [[Enumerable]], установленный в 'true', он будет перечисляться перечислением for-in. См. [§8.6.1] (http://www.ecma-international.org/ecma-262/5.1/#sec-8.6.1) – Oriol

+0

Спасибо ............... ... –

1

Поскольку hasOwnProperty не перечислим, вы можете проверить его с помощью

console.log(Object.getOwnPropertyDescriptor(Object.prototype, "hasOwnProperty").enumerable) 
Смежные вопросы