通常你必须传递一个对象作为参数。访问这些对象的函数是通过引用传递的,并且可以改变原始对象。这取决于情况可能是不想要的结果。那么有没有方法冻结对象呢?我知道Object.freeze()
但它不影响它内部的对象/数组。
例如
a = { arr: [1,2,3]};
Object.freeze(a);
a.arr.push(4); // still works
通常你必须传递一个对象作为参数。访问这些对象的函数是通过引用传递的,并且可以改变原始对象。这取决于情况可能是不想要的结果。那么有没有方法冻结对象呢?我知道Object.freeze()
但它不影响它内部的对象/数组。
例如
a = { arr: [1,2,3]};
Object.freeze(a);
a.arr.push(4); // still works
6条答案
按热度按时间iecba09b1#
要深度冻结所有可枚举属性(ES 2015+):
如果有循环引用:
如果你 * 也 * 必须深度冷冻任何浅冻的东西(稍微慢一点):
tldr;双内衬:
q9yhzks02#
你可以这样做一个非常简单的递归解决方案:
z0qdvdin3#
如果你看一下MDN,那里有一个函数建议deepFreeze功能,但是它不是堆栈安全的。我个人有一个ES5版本可以异步迭代。对于ES6,沿着这样的东西可能会起作用,但是我没有彻底测试它:
警告:我假设对象的属性是可枚举的,如果不是,则使用
getOwnPropertyNames
。gudnpqoy4#
(第二代码[第二灰色区域])https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#What_is_shallow_freeze
谢谢你:)
np8igboo5#
检出
deep-freeze
,它在对象上递归地执行Object.freeze()
以下是他们的实施方式
cu6pst1q6#
另一种方法是使用代理,而不是深度冻结对象,你得到一个禁止写的对象代理: