Object.seal和Object.freeze对比

152 阅读2分钟

Object.seal

  • Object.freeze()  方法可以冻结一个对象,防止被修改
  • 不能添加、删除已有的属性
  • 一个属性如果已经存在了,是可以被修改的。
  • 不能修改该对象已有的可枚举性、可配置、可写。
  • 如果属性是个现有的对象,对象的属性可以被修改、删除、添加,并且整个替换。
  • 如果属性是个数组,数组元素可以被添加或移除,允许修改整个数组的地址
Object.seal(person)
delete person.name; // 删除 失效
person.age =18; // 添加,失效
person.name = 'lily'; // 修改 有效,现有属性
delete person.other.dog; //  对象属性删除 有效
person.other.pig = 19; //  对象属性修改 有效
person.other.cat =5;// 对象属性添加 有效
person.number.push(6) // 数组添加 有效
person.number[0] =10; // 数组修改 有效
delete person.number; // 整个数组删除 失效
console.log(person); // { name: 'lily',other: { pig: 19, cat: 5 },number: [ 10, 3, 6 ] }

Object.freeze

  • Object.freeze()  方法可以冻结一个对象,防止被修改
  • 不能添加、删除已有的属性
  • 不能修改该对象已有的可枚举性、可配置、可写
  • 如果属性是个对象,但是对象的属性可以被修改、删除、添加
  • 如果属性是个数组,数组元素可以被添加或移除,但是不允许修改整个数组的地址
  • 属于浅层次冻结,引用类型还是可以修改堆中的值,只是冻结栈中的地址
const person = { name: "Lydia Hallie",other:{dog:1,pig:6},number:[1,3] };

Object.freeze(person);
delete person.name; // 删除 失效
person.age =18; // 添加,失效
delete person.other.dog; //  对象属性删除 有效
person.other.pig = 19; //  对象属性修改 有效
person.other.cat =5;// 对象属性添加 有效
person.number.push(6) // 数组添加 有效
person.number[0] =10; // 数组修改 有效
delete person.number; // 整个数组删除 失效
console.log(person); // { name: 'Lydia Hallie',other: { pig: 19, cat: 5 },number: [ 10, 3, 6 ] }

对比

使用Object.freeze()冻结的对象中的现有属性值是不可变的。用Object.seal()密封的对象可以改变其现有属性值。比如修改现有属性person.name的值,Object.freeze()不允许修改,而Object.seal()允许。

  • Object.seal()对浅层属性的修改都是允许的,浅层删除、添加无效。深层内部属性删除、添加、修改有效(不允许修改栈中地址,允许修改值)。
  • Object.freeze()不允许修改浅层的现有的属性,浅层删除、添加无效。深层内部属性删除、添加、修改都有效(不允许修改栈中地址,允许修改值)。