gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 05:12:57 24 4
gpt4 key购买 nike

我订阅了常用的成语:

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

但是如果我做类似的事情:

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

当我循环时,是否需要担心 obj 具有“a”和“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”和“b”。

修改 Object 原型(prototype)并不理想(出于多种原因),但“更安全”的方法是使用 Object.defineProperty - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty .您可以将其描述为可枚举或不可枚举。这是一种较新的方法,因此它在浏览器中不是全局可用的。当然,您不能强制其他库使用它,因为您无法控制它们。但如果可以,建议您自己使用。

您使用 hasOwnProperty 是为了确保您正在查看的键是一个实际属性,而不是原型(prototype)链上的属性,并且不可枚举。这确实解决了 prototype“问题”。仅供引用 - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

关于javascript - 安全 - 创建的对象是否可以具有未知属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15817421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com