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
。
推荐阅读: