javascript - 创建任何对象(包括深层属性)的只读/不可变副本

标签 javascript object constants immutability readonly

如何在 JavaScript 中创建对象的只读/不可变版本,其属性不能更改?这也应该适用于任何子对象的属性等等。

我遇到的所有执行此操作的方法(Object.definePropertyObject.freeze 等)仅适用于对象的顶级属性,但不适用于对于子对象。

(一个可能的用例:在特定模块中创建/修改一个settingsconfiguration类型的对象后,您需要将它暴露给程序的其余模块以不可变的形式。)

最佳答案

这是我经过深思熟虑后得出的解决方案。可以很好地满足我的需求,所以我想我会分享它的 QnA 风格。 如果您发现任何改进/问题,请提出建议。

/**
 * Make the the specified object (deeply) immutable or "read-only", so that none of its
 * properties (or sub-properties) can be modified. The converted object is returned.
 * @param {object} obj Input object
 */
makeImmutable: function makeImmutable (obj) {
    if ((typeof obj === "object" && obj !== null) ||
        (Array.isArray? Array.isArray(obj): obj instanceof Array) ||
        (typeof obj === "function")) {

        Object.freeze(obj);

        for (var key in obj) {
            if (obj.hasOwnProperty(key)) {
                makeImmutable(obj[key]);
            }
        }
    }
    return obj;
}

编辑: 简化了代码。现在也可以正确处理数组。

关于javascript - 创建任何对象(包括深层属性)的只读/不可变副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16064136/

相关文章:

c# - 澄清暂时禁用提交按钮几秒钟,然后重新启用它?

javascript - MongoDB - 使用聚合管道进行评论赞成/反对

javascript - 我可以通过访问该对象中的其他值来设置该对象的值吗?

javascript - 使用map方法将javascript对象数组转换为其他对象数组

pointers - LLVM Compiler Infrastructure 中是否有一种方法可以将指针常量转换为不同类型的指针常量?

javascript - 从本地主机加载 json

javascript - 视频没有长高

java - OOP 解析并将对象添加到列表中

c - 为什么 C 不支持使用 if-else 语句初始化 const 变量?

java - ThreadLocal.java中0x61C88647常量的含义是什么