通常你必须传递一个对象作为参数。访问这些对象的函数通过引用传递,并且可以更改原始对象。根据情况,这可能是不需要的结果。那么有没有办法卡住对象。我知道 Object.freeze()
但它不会影响其中的对象/数组。
例如
a = { arr: [1,2,3]};
Object.freeze(a);
a.arr.push(4); // still works
最佳答案
深度卡住所有可枚举属性(ES2015+):
// Recursively freeze an object
const deepFreeze = x => {
Object.freeze(x)
Object.values(x).forEach(deepFreeze)
}
如果你有循环引用:
// Recursively freeze an object with circular references
const deepFreeze = x => {
Object.freeze(x)
Object.values(x).filter(x => !Object.isFrozen(x)).forEach(deepFreeze)
}
如果您还必须深度冷冻任何浅冷冻的东西(稍微慢一点):
// Recursively deep freeze an object with circular references
const deepFreeze = (x, frozen = []) => {
if (frozen.includes(x)) return null
frozen.push(x)
Object.freeze(x)
Object.values(x).forEach(x => deepFreeze(x, frozen))
}
tldr;双线:
const deepFreeze = (x, frozen = []) => frozen.includes(x) ||
frozen.push(Object.freeze(x)) && Object.values(x).forEach(x => deepFreeze(x, frozen))
关于javascript - 有没有一种简单的方法可以在 Javascript 中完全卡住对象及其子对象(Deep Freeze)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56402309/