安全-可以创建具有未知属性的对象
Safety - Can created objects have unknown properties?
我已经订阅了常用的成语:
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
- JavaScript 这返回未知属性
- AngularJS 未知类型错误:无法读取 null 的属性“1”
- 未知的目标实体属性错误
- 如何使属性动态化(在执行代码之前未知)
- 量角器未知错误,从 DOM 中删除属性
- 为什么
- Angular js:->访问解析属性时,angular引发未知提供程序错误
- 属性名称未知的Mustache模板
- 如何在属性名称未知的情况下解析JSON数据
- 在 JavaScript 中的对象中设置具有未知深度的属性值
- 传递未知数量的对象属性
- 如何更改src属性的一部分未知
- 将变量传递给React组件会给出“未知属性error”
- Uncaught InvalidValueError:未知的属性来源
- 访问对象数组中具有未知属性名称的生成属性
- 安全-可以创建具有未知属性的对象
- JS模板和未知属性
- 读取未知属性的名称
- 未知属性@Validation.For("orderName")
- 在IE7中无法使用jQuery选择未知属性