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