我订阅了常用的习语:
for(var key in obj){
if(obj.hasOwnPropery(key)){
// do stuff
}
}
但如果我这样做:
var obj = {a: 'a', b: 'b'};
当我循环播放时,是否需要担心obj
具有“a”和“b”以外的属性?
或者上面的习惯用语主要是开发人员没有创建的对象?
答案 0 :(得分:8)
技术上是的,可以修改Object.prototype
(出于好的或坏的原因)。它们显示为可枚举的属性(在枚举时会显示)。
修改Object.prototype
后,它会影响所有对象实例,因此您的obj
也会包含在内。例如,如果其他一些脚本/库执行此操作:
Object.prototype.keyLength = function () {
var count = 0;
for (var key in this) {
if (this.hasOwnProperty(key)) count++;
}
return count;
};
然后,这将是迭代obj
(不使用hasOwnProperty
)的结果:
a
b
keyLength
(不一定按此顺序)
如果您使用hasOwnProperty
,则只会看到“a”和“b”。
修改Object
原型(由于多种原因)并不理想,但使用Object.defineProperty
- https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty的方法更“安全”。您可以将其描述为可枚举或不可。这是一种较新的方法,因此它不能在浏览器中全局使用。当然,您无法强制其他库使用它,因为您无法控制它们。但如果可以的话,建议您自己使用。
您对hasOwnProperty
的使用是为了确保您所查看的密钥是实际属性,而不是原型链上的属性,并且不可枚举。哪个解决了prototype
“问题”。仅供参考 - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty