我偶然发现了Object.freeze()函数。它似乎是一个非常好的功能,但如何使整个对象(包括嵌套对象)不可变?
例如,我可以在此处更改innerProp
:
const obj = { prop: { innerProp: 1 } };
obj.prop.innerProp = 5;
console.log(obj.prop.innerProp); // 5
是否可以冻结嵌套对象? (ECMAScript 5/6)
答案 0 :(得分:9)
function deepFreeze (o) {
Object.freeze(o);
if (o === undefined) {
return o;
}
Object.getOwnPropertyNames(o).forEach(function (prop) {
if (o[prop] !== null
&& (typeof o[prop] === "object" || typeof o[prop] === "function")
&& !Object.isFrozen(o[prop])) {
deepFreeze(o[prop]);
}
});
return o;
};
https://github.com/substack/deep-freeze
它的公共领域,所以你不必给予信任:D
答案 1 :(得分:0)
const obj = { prop: { innerProp: 1 } };
Object.freeze(obj);
for(let key in obj) {
if(obj.hasOwnProperty(key) && typeof obj[key] === 'object') {
Object.freeze(obj[key]);
}
}
obj.prop.innerProp = 5;
console.log(obj); // const obj = { prop: { innerProp: 1 } };