跳到主要内容

JavaScript 对象 seal() 方法

Object.seal() 方法封闭给定的对象。这阻止了向对象添加新属性,并将所有现有属性标记为不可配置。

示例

const obj = {
name: "John",
age: 30,
};

// 封闭 obj 对象
Object.seal(obj);

// 在严格模式下会抛出错误
// 在非严格模式下静默失败
obj.address = "New York";

console.log(obj.address);

// 输出:undefined

seal() 语法

seal() 方法的语法为:

Object.seal(obj);

作为静态方法的 seal() 需要使用 Object 类名来调用。

seal() 参数

seal() 方法接受以下参数:

  • obj - 要封闭的对象。

seal() 返回值

seal() 方法返回被封闭的对象,即 obj。

示例 1:JavaScript 对象的 seal()

let obj = {
foo: "bar",
func: function () {},
};

// 封闭前,属性可以被
// 添加、修改或移除
obj.foo = "JavaScript";
obj.value = 5;
delete obj.func;

console.log(obj);

// 输出:{ foo: 'JavaScript', value: 5 }

// 封闭对象
let o = Object.seal(obj);

// 仍然可以更改现有的可写属性值
obj.foo = "bar1";
console.log(obj);

// 输出:{ foo: 'bar1', value: 5 }

// 其他更改不会发生,静默失败
obj.foo1 = "bar";
delete obj.foo;

console.log(obj);

// 输出:{ foo: 'bar1', value: 5 }

从上面的示例中可以看出,在封闭 obj 对象之前,我们可以向 obj 对象添加、修改或移除属性。

使用 seal() 方法封闭 obj 后,我们

  • 可以修改现有的可写属性,如 foo 和 value,
  • 不能向 obj 添加新属性(在非严格模式下尝试静默失败)

示例 2:seal() 后重新定义属性

const obj = {
foo: "bar",
};

// 封闭对象
Object.seal(obj);

// 使用 defineProperty() 重新定义 "foo"
Object.defineProperty(obj, "foo", {
get: function () {
return "g";
},
});

// 输出:TypeError: 无法重新定义属性:foo

在上述示例中,由于对象已经被 seal() 方法封闭,因此无法重新定义 foo 属性。因此,我们会得到一个 TypeError

注意

  • 默认情况下,对象是可扩展的(可以向它们添加新属性)。封闭对象使对象上的属性固定且不可变。只要属性是可写的,现有属性的值仍然可以更改。
  • 可以使用 Object.isSealed() 来检查对象是否已封闭。
  • 尝试将数据属性转换为访问器属性或反之将静默失败或抛出 TypeError

推荐阅读: