JavaScript 中的不可变对象(Immutable Objects)

  默认情况下,JavaScript 中的对象是可变的。我们可以更改原始值(字符串,数字等)和对象。我们来看看这个对象:

let obj = {
    num: 10,
    obj: {
        content: "mutable object"
    }
}

  你可以轻松地改变它:

复制代码
obj.num = 5;
obj.obj = { content: "changed!" }
 
console.log(obj);
 
// {
//     num: 5,
//     obj: {
//         content: "changed!"
//     }
// }
复制代码

  非常明确是吧?那么,我们有什么办法使对象不可变呢?

1、让我们试用 const !

  很好的尝试,但是不起作用。如果你尝试一下,你会发现:这种办法根本就不起作用。const 关键字只是修改了某个变量名和其值之间的链接,而不是实际值。您仍然可以像上面所做的那样在 const 对象中更改这两个原始值和对象。例如:

复制代码
const obj = {
    num: 10,
    obj: {
        content: "mutable object"
    }
}
 
obj.num = 5;
obj.obj = { content: "changed!" }
 
console.log(obj);
 
// {
//     num: 5,
//     obj: {
//         content: "changed!"
//     }
// }
复制代码

2、继续尝试:Object.freeze()。

  有很多关于 ES2015 新特性的文章和讨论。我们知道 ES2015 比 ES5 更好。例如,我们可以使用一个Object 方法来实现我们的目的:Object.freeze()。该方法使对象的原始属性不可变。我们把这个方法应用到我们原来的 obj 对象上:

复制代码
Object.freeze(obj);
obj.num = 5;
obj.obj = { content: "changed!" }
 
console.log(obj);
 
// {
//     num: 10,
//     obj: {
//         content: "changed!"
//     }
// }
复制代码

  结果比原先的尝试稍后好一点,原始值现在已经修复,不可更改,但是我们仍然可以更改嵌套对象。

3、最终解决方案

  为了使对象完全不可变,我们还需要freeze()所有的嵌套对象。例如:

复制代码
function deepFreeze(obj) {
    var propNames = Object.getOwnPropertyNames(obj);
    propNames.forEach(function(name) {
        var prop = obj[name];
        if (typeof prop == 'object' && prop !== null) {
            deepFreeze(prop);
        }
    });
    return Object.freeze(obj);
}
复制代码

  使用这个函数,现在我们可以创建完全不可变的对象:

复制代码
deepFreeze(obj);
obj.num = 5;
obj.obj = { content: "changed!" }
 
console.log(obj);
 
// {
//     num: 10,
//     obj: {
//         content: "mutable object"
//     }
// }
复制代码

总结:

  采用递归freeze()所有嵌套对象

 

posted @   古兰精  阅读(2904)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示