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

Javascript 创建任何对象(包括深度属性)的只读/不可变副本,javascript,object,constants,immutability,readonly,Javascript,Object,Constants,Immutability,Readonly,如何在JavaScript中创建属性无法更改的对象的只读/不可变版本?这也应适用于任何子对象的特性等 我遇到的所有方法(Object.defineProperty,Object.freeze,等等)仅适用于对象的顶级属性,而不适用于子对象 (一个可能的用例:在特定模块中创建/修改设置或配置类型对象后,您需要以不可变的形式将其公开给程序的其余模块。)这是我经过深思熟虑后提出的解决方案。适合我的需要,所以我想我会分享它的QnA风格。 如果发现任何改进/问题,请提出建议 /** * Make the

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

我遇到的所有方法(
Object.defineProperty
Object.freeze
,等等)仅适用于对象的顶级属性,而不适用于子对象


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

这是我经过深思熟虑后提出的解决方案。适合我的需要,所以我想我会分享它的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;
}
编辑:
简化了代码。现在还可以正确处理阵列。

对此解决方案感兴趣

以下是代码片段和示例:
/**
*使指定对象(深度)不可变或“只读”,以便其
*可以修改特性(或子特性)。将返回转换后的对象。
*@param{object}obj输入对象
*/
makeImmutable:函数makeImmutable(obj){
如果((对象类型==“对象”&&obj!==null)||
(Array.isArray?Array.isArray(obj):数组的obj实例)||
(obj的类型==“功能”)){
冻结(obj);
for(obj中的var键){
if(对象hasOwnProperty(键)){
makeImmutable(obj[key]);
}
}
}
返回obj;
}
var newObj={
此阵列对象包括:[{
propertyOne:'value1',
属性2:“值2”
}]
};
newObj.thisarayofobjects.push({
属性在“之前3”
});
console.log('newObj',newObj);
$('#viewer').append('newObj:'+JSON.stringify(newObj));
makeImmutable(newObj);
console.log('imutable',newObj);
$('#viewer').append('

imutable:'+JSON.stringify(newObj)); 试一试{ newObj.thisarayofobjects.push({ PropertyTree:“value3” }); }捕获(e){ $(“#查看器”).append(“

不可变错误:”+e.message); log('不可变错误:',e.message); }

答案已经很好了。这一个正在使用:

要使对象不可变,请执行以下操作:

/**
 * Makes an Object immutable by (deep) freezing all own peoperties.
 * @param {*} obj - Object to make immutable.
 * @returns {*} The input Object.
 */
function deepFreeze(obj) {
    if (_.isObject(obj) || _.isArray(obj) || _.isFunction(obj)) {
        Object.freeze(obj);
        _.forOwn(obj, deepFreeze);
    }
    return obj;
}
要创建不可变克隆,请执行以下操作:

var frozenClone = deepFreeze(_.cloneDeep(obj));

很好的解决方案。我在下面使用该解决方案创建了一个代码片段,以展示它的使用方法和证明<代码>向上投票
var frozenClone = deepFreeze(_.cloneDeep(obj));