JavaScript 遍历对象属性和原型链
JavaScript iterating over object properties and the prototype chain
MDN 状态:
Also, when iterating over the properties of an object, every enumerable property that is on the prototype chain will be enumerated.
所以我尝试了这个:
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
。为什么?
因为Object.prototype.hasOwnProperty
是不可枚举的:
Object.getOwnPropertyDescriptor(Object.prototype, 'hasOwnProperty')
.enumerable // false
因此,它不会被 for...in
循环迭代。
因为 hasOwnProperty 是不可枚举的,你可以使用
来测试它
console.log(Object.getOwnPropertyDescriptor(Object.prototype, "hasOwnProperty").enumerable)
如上所述,对象的每个 属性 都有一个 'enumerable' 标志。当标志设置为 false 时,属性 将不会在遍历对象属性时被枚举。
Object.prototype.hasOwnProperty 是 non-enumerable 这意味着 'enumerable' 标志设置为 false。
你可以阅读我写的关于这个话题的文章here来加深你的知识。
MDN 状态:
Also, when iterating over the properties of an object, every enumerable property that is on the prototype chain will be enumerated.
所以我尝试了这个:
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
。为什么?
因为Object.prototype.hasOwnProperty
是不可枚举的:
Object.getOwnPropertyDescriptor(Object.prototype, 'hasOwnProperty')
.enumerable // false
因此,它不会被 for...in
循环迭代。
因为 hasOwnProperty 是不可枚举的,你可以使用
来测试它console.log(Object.getOwnPropertyDescriptor(Object.prototype, "hasOwnProperty").enumerable)
如上所述,对象的每个 属性 都有一个 'enumerable' 标志。当标志设置为 false 时,属性 将不会在遍历对象属性时被枚举。
Object.prototype.hasOwnProperty 是 non-enumerable 这意味着 'enumerable' 标志设置为 false。
你可以阅读我写的关于这个话题的文章here来加深你的知识。