Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 安全-创建的对象是否可以具有未知属性?_Javascript - Fatal编程技术网

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

Javascript 安全-创建的对象是否可以具有未知属性?,javascript,Javascript,我订阅了一个常见的成语: for(var key in obj){ if(obj.hasOwnPropery(key)){ // do stuff } } 但如果我这样做: var obj = {a: 'a', b: 'b'}; 当我循环时,是否需要担心obj具有除“a”和“b”以外的属性 或者上述习惯用法主要是针对开发人员没有创建的对象吗?技术上是的,可以修改对象.prototype(出于好的或坏的原因)。这些属性显示为可枚举属性(将在枚举时显示) 当修改

我订阅了一个常见的成语:

for(var key in obj){
    if(obj.hasOwnPropery(key)){ 
        // do stuff
    }
}
但如果我这样做:

var obj = {a: 'a', b: 'b'};
当我循环时,是否需要担心
obj
具有除“a”和“b”以外的属性


或者上述习惯用法主要是针对开发人员没有创建的对象吗?

技术上是的,可以修改
对象.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
)的结果:

(不一定按该顺序)

如果使用了hasOwnProperty,则只能看到“a”和“b”

修改
对象
原型并不理想(有几个原因),但“更安全”的方法是使用
对象。defineProperty
-。您可以将其描述为可枚举或不可枚举。这是一种较新的方法,因此它在浏览器中不是全局可用的。当然,您不能强制其他库使用它,因为您无法控制它们。但如果可以的话,建议你自己使用


使用
hasOwnProperty
是为了确保所查看的键是实际属性,而不是原型链上的属性,并且不可枚举。这解决了原型的问题。仅供参考-

如果我在自己的生活中运行,像大多数库一样,另一个库是否可以修改我使用的Object.prototype?如果他有自己的属性(),它是否仍然影响他?对于一个库,你会看到一些东西断裂,并对正在修改的Object.prototype提出怀疑。事实上,我同意你的回答,我的评论有点像是对人们过分热情的咆哮。例如,如果某些第三方代码做了代码> Obj.PrimyTyth.HasObjy=函数({)返回true;}。现在怎么办?唯一的解决办法是从iframe中获取一个干净的Object.prototype。这是否意味着我们应该得到一个干净的原型,并且只使用它?我希望不会。@livingston_机械航天飞机也会坠毁!:)@bfavareto酷,谢谢你的设置。是的,我能想到的唯一“限制”是对象的
cleanPrototype instanceof
为false(不确定这对您来说是否明显)。我不知道会有什么影响,但前几天我在这里看到了。
a
b
keyLength