我的回答
function freeze() {const keys = Object.keys(this)if (keys.length > 0) {keys.forEach(key => {Object.defineProperty(this, key, {enumerable: false,writable: false,configurable: false,}),freeze(this[key])})}}Object.prototype.freeze = freeze
参考回答
Object.freeze方法可以冻结一个对象,冻结是指不能向这个对象添加新的属性,不能修改现有属性的值,不能删除属性,甚至不能修改这个对象现有属性的可枚举性、可配置性、可写性。换句话说,这个对象永远是不可变的,此方法返回被冻结的对象。
Object.freeze是浅冻结
const obj = {name: "zf",address: {city: "beijing",},};const freezeObj = Object.freeze(obj);freezeObj.name = "new name";console.log(freezeObj.name); // 仍然是zf// 严格模式会报错("use strict");freezeObj.name = "new name"; // TypeError//Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'// 但是address 是没有被冻结的freezeObj.info.age= 12;console.log(freezeObj.info.age); // 12
简单实现的代码
function myFreeze(obj) {// 判断参数是否为Object类型if (obj instanceof Object) {for (let key in obj) {if (obj.hasOwnProperty(key)) {Object.defineProperty(obj, key, {writable: false, // 设置只读});Object.seal(obj); // 封闭对象}}}return obj;}
- Object.defineProperty()方法定义对象属性的特性,比如是否删除,是否修改,是否可枚举等
- Object.seal()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置
