lovelmh13 / myBlog

个人博客 记录菜狗的学习之路
6 stars 0 forks source link

创建不可变对象 #59

Open lovelmh13 opened 3 years ago

lovelmh13 commented 3 years ago
const immutable = { a: 1 }

// Object.defineProperty(immutable) 这个方法不可取,因为这个只能控制属性

// 方法 1 阻止对象扩展,不能再添加新属性,但是可以修改删除已有的属性
Object.preventExtensions(immutable)
immutable.a = 2

// 方法 2 冷冻对象, 冻结后就不能再被扩展了。被冻结的对象的原型也不能被改变。如果对象的属性是一个对象,那么这个对象属性可以被修改
Object.freeze(immutable)

immutable.a = 1
immutable.__proto__ = String.prototype // Uncaught TypeError: [object Object] is not extensible

// 方法 3 密封, 阻止添加新属性,同时将现有属性标记为不可配置(不可以对原有属性通过 defineProperty 重新配置 ),原属性本来就可以修改的话,依然可以修改。除了修改原有属性以外,所有操作都会失败
Object.seal(immutable)

immutable.a = 2
delete immutable.a
immutable.b = 3

console.log(immutable)