根据MDN:
propertyIsEnumerable()方法返回一个布尔值,指示指定的属性是否可枚举
但是当我运行以下代码时,它会输出:
方法信息不可枚举
但可以在for循环中看到
var Person = function(name){
this.name = name;
};
Person.prototype.info = function(){
console.log("Name =", this.name);
};
var me = new Person('Mike');
console.log('method info is' + (me.propertyIsEnumerable('info') ? '' : ' NOT') + ' enumerable');
for(var k in me) {
if (k == 'info') {
console.error('but can be seen in for loop')
}
}
这让我很困惑。
更新
正如@RobG所回答的那样,由于propertyIsEnumerable
只检查对象本身的属性,如果我只想在对象上迭代属性,我该怎么办?
答案 0 :(得分:3)
propertyIsEnumerable仅检查对象本身的属性,它不考虑原型链。所以:
me.propertyIsEnumerable('info')
返回false,因为 me 上没有 info 属性,它位于 Person.prototype 上。它显示在 for 循环中,因为它将迭代 me 的所有属性,包括从其构造函数原型继承的那些属性。
由于这种行为, propertyIsEnumerable 在早期版本的Safari中用作 hasOwnProperty 的替代品,其中 hasOwnProperty 有错误或不存在(我无法记住哪一个)。