[JS] Object.freeze和Object.seal

1. Object.freeze

const obj1 = {
    a:1,
};

const obj2 = Object.freeze(obj1);

obj1 === obj2;
// 返回原来的对象

Object.isExtensible(obj2);  // false

Object.getOwnPropertyDescriptor(obj2,'a'); 
// {value: 1, writable: false, enumerable: true, configurable: false}

Object.freeze做了两件事情,
(1)给对象设置,Object.preventExtension(obj1)
禁止更改原型,禁止添加属性,

(2)为对象的每一个属性设置,writable:false
禁止更改属性值,

(3)为对象的每一个属性设置,configurable:false
禁止删除属性,禁止更改writabletrue,禁止更改enumerablefalse,禁止更改configuabletrue

注:
禁止添加属性,是Object.preventExtensions控制的,
而禁止删除属性,是configuable:false控制的。

例子,

// 禁止更改原型
Object.setPrototypeOf(obj2,{c:3});  
// 非严格模式:Uncaught TypeError: #<Object> is not extensible
// 严格模式:Uncaught TypeError: #<Object> is not extensible

// 禁止添加属性
obj2.b = 2;  
// 非严格模式,静默失败,obj2还是{a:1}
// 严格模式:Uncaught TypeError: Cannot add property b, object is not extensible

// 禁止更改属性值
obj2.a = 2;  
// 非严格模式,静默失败,obj2还是{a:1}
// 严格模式:Uncaught TypeError: Cannot assign to read only property 'a' of object '#<Object>'

// 禁止删除已有属性
delete obj2.a;  
// 非严格模式,返回false
// 严格模式:Uncaught TypeError: Cannot delete property 'a' of #<Object>

/// 禁止更改writable为true
Object.defineProperty(obj2,'a',{
    writable:true,
});  
// 非严格模式:Uncaught TypeError: Cannot redefine property: a
// 严格模式:Uncaught TypeError: Cannot redefine property: a

// 禁止更改enumerable为false
Object.defineProperty(obj2,'a',{
    enumerable:false,
});  
// 非严格模式:Uncaught TypeError: Cannot redefine property: a
// 严格模式:Uncaught TypeError: Cannot redefine property: a

// 禁止更改configuable为true
Object.defineProperty(obj2,'a',{
    configuable:true,
});  
// 非严格模式,静默失败,configuable还是false
// 严格模式:静默失败,configuable还是false

注:
在严格模式下,更改configurabletrue,同样是静默失败。

2. Object.seal

const obj1 = {
    a:1,
};

const obj2 = Object.seal(obj1);

obj1 === obj2;
// 返回原来的对象

Object.isExtensible(obj2);  // false

Object.getOwnPropertyDescriptor(obj2,'a'); 
// {value: 1, writable: true, enumerable: true, configurable: false}

Object.freeze做了两件事情,
(1)给对象设置,Object.preventExtension(obj1)
禁止更改原型,禁止添加属性,

(2)为对象的每一个属性设置,configurable:false
禁止更改属性值,

Object.freeze不同的是,Object.seal后的对象是可写的writable:true


参考

MDN: Object.freeze
MDN: Object.preventExtensions
MDN: Object.isExtensible
MDN: Object.getOwnPropertyDescriptor
MDN: Object.seal

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • (注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!)(注2:更多内容请查看我的目录。) ...
    love丁酥酥阅读 1,887评论 4 7
  • 此文章用于归纳Object的所有方法 在JavaScript中,object是所有对象的基础(原型链的顶端),所以...
    moonburn阅读 674评论 0 5
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,692评论 0 5
  • 概述 JavaScript提供了一个内部数据结构,用来描述一个对象的属性的行为,控制它的行为。这被称为“属性描述对...
    zjh111阅读 739评论 0 0
  • 概述 JavaScript提供了一个内部数据结构,用来描述一个对象的属性的行为,控制它的行为。这被称为“属性描述对...
    许先生__阅读 522评论 0 1