安全性 - 创建的对象是否具有未知属性?

时间:2013-04-04 17:07:21

标签: javascript

我订阅了常用的习语:

for(var key in obj){
    if(obj.hasOwnPropery(key)){ 
        // do stuff
    }
}

但如果我这样做:

var obj = {a: 'a', b: 'b'};

当我循环播放时,是否需要担心obj具有“a”和“b”以外的属性?

或者上面的习惯用语主要是开发人员没有创建的对象?

1 个答案:

答案 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