在MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty)上,我看到了如下代码段:
var buz = {
fog: 'stack'
};
for (var name in buz) {
if (buz.hasOwnProperty(name)) {
console.log('this is fog (' + name + ') for sure. Value: ' + buz[name]);
}
else {
console.log(name); // toString or something else
}
}
在摘要中,console.log(name); // toString or something else
我有点困惑。我了解toString
是的一个属性,Object.prototype
可以通过访问此属性buz.toString
。
但是,当我在Chrome中运行该代码段时,我没有看到该toString
属性被打印(console.log),尽管注释中说应该由该属性进行迭代for..in
和打印。
有谁知道为什么不能通过“ for..in”来迭代原型的属性?
for x in obj
仅迭代对象的可枚举属性(包括原型中的那些属性)。给定的属性可以标记为可枚举或不可枚举。因此,如果for/in
跳过某些属性,则可能是因为该属性未配置为可枚举。
请参阅此处的工作演示:http : //jsfiddle.net/jfriend00/gyc9gnmj/,该示例显示了如何仅使用可枚举的属性进行迭代for x in obj
。
而且,实际上,您可以看到该toString()
方法被标记为enumerable: false
以下代码:
function log(x) {
document.write(JSON.stringify(x));
}
var buz = {
fog: 'stack'
};
log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(buz), "toString"));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句