禁止在对象中设置“新建”或“未声明”属性

Disallow setting New or Undeclared property in an object

本文关键字:未声明 属性 对象 新建 设置 禁止      更新时间:2023-09-26

假设我有一个JavaScript对象和一些属性。

var properties = {
    x : 10,
    y : 20,
    z : 30,
};

在这里,我声明并定义了属性xyz。因此,我可以分别使用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}