JavaScript Object.seal() 方法

Object.seal() 语法

Object.seal() 是 JavaScript 的一个静态方法,它用于将任意对象转换为一个 “密封对象” 。对于密封对象来说,它具有以下特点。

  • 无法添加新属性。
  • 无法删除现有属性。
  • 无法修改可配置性(configurable)和可枚举性(enumerate)。
  • 无法重新指定原型(prototype)。
  • 只要原对象的属性是可写的(writable),那么它们仍然可以被修改。

语法:

Object.seal(obj)

说明:

Object.seal() 方法接收单个参数。

  • obj(必选):是一个对象。

Object.seal() 方法是有返回值的,也就是返回原对象(只是该对象已经被变为密封对象而已)。

Object.seal() 方法具有以下特性。

  • 浅封闭性:Object.seal() 实现的是 “浅封闭”,它只会封闭对象自身的属性。如果对象包含其他对象(如数组或嵌套对象),这些嵌套对象本身并不会被封闭。
  • 可扩展性(Extensible):封闭对象会将对象的 extensible 特性设置为 false。
  • 可配置性(Configurable):封闭对象会将所有自身属性的 configurable 特性设置为 false。这意味着你不能删除属性,也不能改变属性的描述符。
  • 可写性(Writable):封闭对象不会改变现有属性的 writable 特性。如果属性本来就是可写的,那么它在封闭后仍然是可写的,你可以修改它的值。

Object.seal() 与 Object.freeze() 的核心区别在于:

  • 密封后的对象(sealed),其现有属性依然可以被修改(只要该属性原本是可写的)。
  • 冻结后的对象(frozen),不仅不能增删属性,连现有属性的值也不能改。

注意:

  • seal() 方法是一个静态方法,它只能被类名(即 Object)调用,而无法被实例调用。
  • 我们可以使用 Object.isSealed() 方法来判断一个对象是否为密封对象。

Object.seal() 摘要

属于 JavaScript Object 对象
使用频率
官方文档 查看
MDN 查看

Object.seal() 示例

接下来,我们通过一个简单的例子来讲解一下 Object.seal() 方法是如何使用的。

示例 1:尝试为密封对象添加属性

const obj = {};
Object.seal(obj);
obj.name = "Jack";
console.log(obj);

运行结果如下。

(报错)TypeError: Cannot add property name, object is not extensible

分析:

Object.seal() 方法会将一个对象转换为不可扩展对象,如果尝试为不可扩展对象添加新属性,则会报错。

注意: 此报错仅在 “严格模式("use strict")”下触发。在非严格模式下,添加属性操作会被忽略,但不会抛出异常。

Object.freeze()、Object.seal() 和 Object.preventExtensions()

Object.freeze()、Object.seal() 和 Object.preventExtensions() 这 3 个方法非常相似,你可以从下表清楚地看出它们的区别。

Object.freeze()、Object.seal() 和 Object.preventExtensions()
添加属性 读取属性 修改属性 删除属性
Object.freeze() × × ×
Object.seal() × ×
Object.preventExtensions ×

示例 2:Object.freeze()

const obj = { a: 1 };

Object.freeze(obj);
console.log(Object.isFrozen(obj));
console.log(Object.isSealed(obj));
console.log(Object.isExtensible(obj));

运行结果如下。

true
true
false

示例 3:Object.seal()

const obj = { a: 1 };

Object.seal(obj);
console.log(Object.isFrozen(obj));
console.log(Object.isSealed(obj));
console.log(Object.isExtensible(obj));

运行结果如下。

false
true
false

示例 4:Object.preventExtensions()

const obj = { a: 1 };

Object.preventExtensions(obj);
console.log(Object.isFrozen(obj));
console.log(Object.isSealed(obj));
console.log(Object.isExtensible(obj));

运行结果如下。

false
false
false

上一篇: Object.freeze()

下一篇: Object.preventExtensions()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号