禁止在对象中设置“新建”或“未声明”属性
Disallow setting New or Undeclared property in an object
假设我有一个JavaScript对象和一些属性。
var properties = {
x : 10,
y : 20,
z : 30,
};
在这里,我声明并定义了属性x
、y
和z
。因此,我可以分别使用properties.x
, properties.y
, properties.z
访问它们。
假设我现在尝试设置另一个我没有声明的属性。
properties.foo = 100;
这是允许的,properties.foo
现在被定义为100
。
然而,由于我从未在var properties = { ... }
中声明foo
,所以我想这样做,当有人试图设置foo
时,会抛出异常。
或者更一般地说,当有人试图设置我最初没有在var properties = { ... }
中声明的任何属性时,我想抛出一个异常。
这可能吗?
理想情况下,我应该仍然能够更改我之前设置的属性。因此,我应该仍然能够做properties.x = 40;
没有任何问题。
我这样做的动机是为了防止在更改现有属性时出现错别字。例如,我打算设置properties.x = 40
,但不小心写成了properties.c = 40
。这可能会产生意想不到的效果和/或引起调试头痛。
下面是jsfiddle中的一个例子。
var properties = {
x : 10,
y : 20,
z : 30,
};
console.log(properties.x); // ok, logs 10
console.log(properties.y); // ok, logs 20
console.log(properties.z); // ok, logs 30
properties.foo = 100; // should not be ok, because there is no foo in properties.
properties.x = 40; // should be ok.
console.log(properties.x); // ok, logs 40
console.log(properties.foo); // logs 100, but should be undefined.
JavaScript允许你在任何时候添加属性。代码在做它应该做的。如果你想避免这种情况,你必须使用EcmaScript5函数
Object.freeze()
在对象上。
使用Object.preventExtensions()。现有的属性仍然可以修改,但任何尝试添加新属性都会抛出TypeError
.
let properties = Object.preventExtensions({
x : 10,
y : 20,
z : 30,
})
properties.x = 40 // 40
properties.c = 40 // TypeError: Cannot add property c, object is not extensible
注意属性仍然可以被删除。
delete properties.x // {y: 20, z: 30}
相关文章:
- 以纯文本加载的脚本-未声明纯文本文档的字符编码
- 是否可以在另一个变量中使用未声明的变量
- Eval未声明函数
- JQuery关键字“;这个“;未获取属性值
- 是否可以在 Javascript 中将未声明的变量作为参数传递
- 无法使用 ant 和闭包编译器编译 javascript,因为 Jquery 的 $ 是未声明的
- 将对象作为参数传递后的未定义属性
- 如何区分未声明和未定义的 JavaScript 对象属性
- 检查链接对象形式中未定义属性的最佳实践是什么
- PhantomJS中的evalute内部未定义属性
- 访问数字类型的未定义属性
- Javascript未声明变量
- 为什么可以将未声明的函数传递给setTimeout
- AngularJS指令作用域未解析(“属性名称未定义”错误)
- 为什么以及如何使用 jQuery 未声明的变量作为 ID
- 在 Angular 服务中接收函数的未声明变量
- 使用原型而不是在对象本身上声明属性有什么好处吗?
- 让 javascript 将(默认情况下)未声明的变量声明到当前本地范围(基于首次使用)而不是全局范围
- 如何评估潜在未声明变量的属性
- 禁止在对象中设置“新建”或“未声明”属性