如何在javascript中冻结嵌套对象?

时间:2016-01-13 20:55:10

标签: javascript

我偶然发现了Object.freeze()函数。它似乎是一个非常好的功能,但如何使整个对象(包括嵌套对象)不可变?

例如,我可以在此处更改innerProp

const obj = { prop: { innerProp: 1 } };
obj.prop.innerProp = 5;
console.log(obj.prop.innerProp); // 5

是否可以冻结嵌套对象? (ECMAScript 5/6)

2 个答案:

答案 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 } };