Object.freeze
该方法会将一个对象进行冻结。冻结的含义:对象已有的属性值不能被重写,不能再给对象添加或者删除属性。并且,冻结后的对象的原型也是不可修改的。
但是如果被冻结对象中的一个属性是一个对象,则该对象中的属性是可以修改的,除非他被声明为冻结对象。
- 不可枚举的属性也要进行冻结
- 只冻结对象自身的属性,原型对象上的属性不冻结。
- symbol类型数据的单独处理
- 对象所有自有的属性的不可编辑
const _objectFreeze = object => {
if(typeof object !== 'object' || object === null) {
throw new TypeError(`the ${object} is not a object`)
}
//for in 语句会将原型链上的可枚举属性也返回
const keys = Object.getOwnPropertyNames(object)
const symbols = Object.getOwnPropertySymbols(object)
[...keys, ...symbols].forEach(key => {
Object.defineProperty(object, key, {
//对象属性的相关配置
configurable: false,//属性是否可以删除和重新定义
writable: false,//属性值是否可以修改
})
})
//冻结所有属性
Object.seal(object)
}