Skip to main content

Object.isSealed()

语法

isSealed(o: any): boolean;

描述

用于判断一个对象是否被密封。 对于一个 不可扩展 的对象,如果它是一个 空对象 ,那么它是 被密封 的;但如果它是个 非空对象 ,并且里面的属性是 可配置的,那么该对象 不是被密封 的,因为密封对象的所有自身属性必须是不可配置的。

示例

// 不可扩展的空对象是密封的.
const non_ExtensibleEmptyObj = Object.preventExtensions({});
Object.isSealed(non_ExtensibleEmptyObj); // true

// 不可扩展的非空对象不是密封的(因为属性仍是可配置的)
const non_ExtensibleObj = Object.preventExtensions({ name: 'yancey' });
Object.isSealed(non_ExtensibleObj); // false

// 密封对象是密封的.
const sealedObj = Object.seal({});
Object.isSealed(sealedObj); // true

// 冻结对象也是密封的.
const frozen = Object.freeze({});
Object.isSealed(frozen); // true

下面这个例子是 间接 让一个对象 被密封,也就是先将此对象 不可扩展,再给每个属性施加 不可配置

const obj = {
name: 'yancey',
};

// 一个普通的非空对象不是被密封的
Object.isSealed(obj); // false

// 但对该对象施加不可扩展方法
Object.preventExtensions(obj);
// 并使所有属性不可配置
Object.defineProperty(obj, 'name', {
configurable: false,
});

// 该对象已被密封
Object.isSealed(obj); // true

扩展

在 ES5 中,如果这个方法的参数不是一个对象(一个原始类型),那么它会导致 TypeError。在 ES6+ 中,非对象参数将被视为是一个密封的普通对象,只返回 true.

// TypeError: 1 is not an object (ES5)
Object.isSealed(1);

// ES6
Object.isSealed(1); // true