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