Object.seal()
方法会密封给定的对象。这会阻止向对象添加新属性,并将所有现有属性标记为不可配置。
示例
const obj = {
name: 'John',
age: 30
};
// seal the obj object
Object.seal(obj);
// throws an error in strict mode
// silently fails in non-strict mode
obj.address = "New York";
console.log(obj.address);
// Output: undefined
seal() 语法
seal()
方法的语法是
Object.seal(obj)
seal()
方法作为一个静态方法,使用 Object
类名进行调用。
seal() 参数
seal()
方法接收
- obj - 要密封的对象。
seal() 返回值
seal()
方法返回被密封的对象,即 obj。
示例 1:JavaScript Object.seal()
let obj = {
foo: "bar",
func: function () {},
};
// before sealing, properties can be
// added, modified, or removed
obj.foo = "JavaScript";
obj.value = 5;
delete obj.func;
console.log(obj);
// Output: { foo: 'JavaScript', value: 5 }
// seal the object
let o = Object.seal(obj);
// can still change property values
// as it is writable by default
obj.foo = "bar1";
console.log(obj);
// Output: { foo: 'bar1', value: 5 }
// no other change happens, fails silently
obj.foo1 = "bar";
delete obj.foo;
console.log(obj);
// Output: { foo: 'bar1', value: 5 }
从上面的示例可以清楚地看出,在对象被密封之前,我们可以向 obj 对象添加、修改或删除属性。
在使用 seal()
方法密封 obj 后,我们
- 可以修改现有可写属性,例如 foo 和 value,
- 不能向 obj 添加新属性(在非严格模式下,尝试会静默失败)
示例 2:seal() 后重新定义属性
const obj = {
foo : "bar",
}
// seal the object
Object.seal(obj);
// redefine "foo" using defineProperty()
Object.defineProperty(obj, "foo", {
get: function () {
return "g";
},
});
// Output: TypeError: Cannot redefine property: foo
在上面的示例中,由于对象已被 seal()
方法密封,因此无法重新定义 foo 属性。因此,我们得到一个 TypeError
。
注意事项:
- 默认情况下,对象是可扩展的(可以向其中添加新属性)。密封对象会使对象上的属性固定且不可变。只要属性是可写的,它们的值仍然可以被更改。
- 可以使用
Object.isSealed()
来检查对象是否已被密封。 - 尝试将数据属性转换为访问器属性或反之亦然的操作将静默失败或抛出
TypeError
。
另请阅读