我的回答
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()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置