我偶然发现了Object.freeze()函数.它似乎是一个非常好的功能,但如何使整个对象(包括嵌套对象)不可变?
例如我可以innerProp在这里改变:
const obj = { prop: { innerProp: 1 } };
obj.prop.innerProp = 5;
console.log(obj.prop.innerProp); // 5
Run Code Online (Sandbox Code Playgroud)
是否有可能冻结嵌套对象?(ECMAScript 5/6)
bir*_*day 12
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;
};
Run Code Online (Sandbox Code Playgroud)
https://github.com/substack/deep-freeze
这是公共领域,所以你不必给予信任:D
在 TS 和 ES2015 中该函数可以变得更加简洁。
import type { ReadonlyDeep } from 'type-fest';
export function deepFreeze<T>(o: T) {
Object.values(o).forEach(v => Object.isFrozen(v) || deepFreeze(v));
return Object.freeze(o) as ReadonlyDeep<T>;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3389 次 |
| 最近记录: |