对象属性之对象状态

我们知道,属性描述符只能用来控制对象中一个属性的状态。而如果要控制对象的状态,就要用到下面的6种方法:

【1】Object.preventExtensions()(禁止扩展);【2】Object.isExtensible()(测试扩展)。

【3】Object.seal()(对象封印);【4】Object.isSealed()(测试封印)。

【5】Object.freeze()(对象冻结);【6】Object.isFrozen()(检测冻结)。

Object.preventExtensions()(禁止扩展)

Object.preventExtensions()方法使一个对象无法再添加新的属性 ,并返回当前对象

Object.isExtensible()(测试扩展)

Object.isExtensible()方法用来检测该对象是否可以扩展

var o = {a:1};
console.log(Object.isExtensible(o));//true
o.b = 2;
console.log(o);//{a: 1, b: 2}
console.log(Object.preventExtensions(o));//{a: 1, b: 2}
//由于对象o禁止扩展,所以该赋值语句静默失败
o.c = 3;
console.log(Object.isExtensible(o));//false
console.log(o);//{a: 1, b: 2}

在严格模式下,给禁止扩展的对象添加属性会报TypeError错误:

'use strict';
var o = {a:1};
console.log(Object.preventExtensions(o));//{a:1}
//Uncaught TypeError: Can't add property c, object is not extensible
o.c = 3;

Object.preventExtensions()方法并不改变对象中属性的描述符状态:

var o = {a:1};
//{value: 1, writable: true, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(o,'a'));
Object.preventExtensions(o);
//{value: 1, writable: true, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(o,'a'));

Object.seal()(对象封印)

对象封印又叫对象密封,使一个对象不可扩展并且所有属性不可配置 ,并返回当前对象

Object.isSealed()(测试封印)

Object.isSealed()方法用来检测该方法是否被封印

var o = {a:1,b:2};
console.log(Object.isSealed(o));//false
console.log(Object.seal(o));//{a:1,b:2}
console.log(Object.isSealed(o));//true
console.log(delete o.b);//false
o.c = 3;
console.log(o);//{a:1,b:2}

在严格模式下,删除旧属性或添加新属性都会报错

'use strict';
var o = {a:1,b:2};
console.log(Object.seal(o));//{a:1,b:2}
//Uncaught TypeError: Cannot delete property 'b' of #<Object>
delete o.b;

这个方法实际上会在现有对象上调用Object.preventExtensions()方法,并把所有现有属性的configurable描述符置为false

var o = {a:1,b:2};
//{value: 1, writable: true, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(o,'a'));
console.log(Object.seal(o));//{a:1,b:2}
//{value: 1, writable: true, enumerable: true, configurable: false}
console.log(Object.getOwnPropertyDescriptor(o,'a'));

Object.freeze()(对象冻结)

Object.freeze()方法使一个对象不可扩展,不可配置,也不可改写,变成一个仅可以枚举的只读常量 ,并返回当前对象

Object.isFrozen()(检测冻结)

Object.isFrozen()方法用来检测一个对象是否被冻结

var o = {a:1,b:2};
console.log(Object.isFrozen(o));//false
console.log(Object.freeze(o));//{a:1,b:2}
console.log(Object.isFrozen(o));//true
o.a = 3;
console.log(o);//{a:1,b:2}

在严格模式下,删除旧属性、添加新属性、更改现有属性都会报错

'use strict';
var o = {a:1,b:2};
console.log(Object.freeze(o));//{a:1,b:2}
//Uncaught TypeError: Cannot assign to read only property 'a' of object '#<Object>'
o.a = 3;

这个方法实际上会在现有对象上调用Object.seal()方法,并把所有现有属性的writable描述符置为false

var o = {a:1};
//{value: 1, writable: true, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(o,'a'));
console.log(Object.freeze(o));//{a:1}
//{value: 1, writable: false, enumerable: true, configurable: false}
console.log(Object.getOwnPropertyDescriptor(o,'a'));

// 相关话题:

【1】对象属性的操作: 链接

属性操作可分为属性查询、属性设置、属性删除,还包括属性继承。

【2】对象属性描述符: 链接

属性描述符用来描述对象的值、是否可配置、是否可修改以及是否可枚举。

【3】对象状态: “内容即本文。”

属性描述符只能用来控制对象中一个属性的状态,而如果要控制整个对象的状态,就要用到6种对象状态。

文章目录
  1. Object.preventExtensions()(禁止扩展)
  2. Object.isExtensible()(测试扩展)
  3. Object.seal()(对象封印)
  4. Object.isSealed()(测试封印)
  5. Object.freeze()(对象冻结)
  6. Object.isFrozen()(检测冻结)
  7. // 相关话题: