安全-可以创建具有未知属性的对象

Safety - Can created objects have unknown properties?

本文关键字:未知 属性 对象 创建 安全      更新时间:2023-09-26

我已经订阅了常用的成语:

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

但是如果我这样做:

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

当我循环时,我需要担心obj具有"a"answers"b"以外的属性吗?

或者上面的习惯用法主要用于您作为开发人员并没有创建的对象?

从技术上讲,可以修改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"answers"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