不允许在对象中设置 New 或 Undeclared 属性
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
。这可能会产生不良影响 and/or 会导致调试问题。
Here is an example in 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}
假设我有一个具有某些属性的 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
。这可能会产生不良影响 and/or 会导致调试问题。
Here is an example in 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}