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()不允许修改浅层的现有的属性,浅层删除、添加无效。深层内部属性删除、添加、修改都有效(不允许修改栈中地址,允许修改值)。