JavaScript 中的不可变对象(Immutable Objects)
默认情况下,JavaScript 中的对象是可变的。我们可以更改原始值(字符串,数字等)和对象。我们来看看这个对象:
let obj = {
num: ,
obj: {
content: "mutable object"
}
}
你可以轻松地改变它:
obj.num = ;
obj.obj = { content: "changed!" } console.log(obj); // {
// num: 5,
// obj: {
// content: "changed!"
// }
// }
非常明确是吧?那么,我们有什么办法使对象不可变呢?
1、让我们试用 const
!
很好的尝试,但是不起作用。如果你尝试一下,你会发现:这种办法根本就不起作用。const
关键字只是修改了某个变量名和其值之间的链接,而不是实际值。您仍然可以像上面所做的那样在 const
对象中更改这两个原始值和对象。例如:
const obj = {
num: ,
obj: {
content: "mutable object"
}
} obj.num = ;
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 = ;
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 = ;
obj.obj = { content: "changed!" } console.log(obj); // {
// num: 10,
// obj: {
// content: "mutable object"
// }
// }
总结:
采用递归freeze()所有嵌套对象
JavaScript 中的不可变对象(Immutable Objects)的更多相关文章
- python、javascript中的不可变对象
比如python中str是不变对象,而list是可变对象,javascript中str也是不变对象,而array是可变对象 python的例子: >>> a = 'abc' > ...
- 深入理解Java中的不可变对象
深入理解Java中的不可变对象 不可变对象想必大部分朋友都不陌生,大家在平时写代码的过程中100%会使用到不可变对象,比如最常见的String对象.包装器对象等,那么到底为何Java语言要这么设计,真 ...
- javascript中遇到的字符串对象处理
在javascript中对参数处理: 1 <script> 2 function getParam() 3 { 4 urlInfo=window.location.href; //获取当前 ...
- javascript中的内置对象
2015.12.1 javascript中的内置对象 复习: 1.js中的内置函数 alert prompt write parseInt parseFloat eval isNaN document ...
- (转载)JavaScript中的Window窗口对象
(转载)http://www.ijavascript.cn/jiaocheng/javascript-window-65.html 例子: <html> <head> < ...
- javaScript中Math内置对象基本方法入门
概念 Math 是javaScript的内置对象,包含了部分数学常数属性和数学函数方法. Math 不是一个函数对象,用户Number类型进行使用,不支持BigInt. Math 的所有属性与方法都是 ...
- Python中的不可变对象类型与可变对象类型
https://blog.csdn.net/answer3lin/article/details/86430074 其实各个标准资料中没有说明Python有值类型和引用类型的分类,这个分类一般是C++ ...
- javascript中的内置对象和数据结构
目录 简介 基础类型 undefined Boolean和Boolean对象 Number和BigInt String Symbol null Object Function Date Array K ...
- 深入理解Javascript中构造函数和原型对象的区别
在 Javascript中prototype属性的详解 这篇文章中,详细介绍了构造函数的缺点以及原型(prototype),原型链(prototype chain),构造函数(constructor) ...
随机推荐
- display:flex代替float
昨天做一个css的东西,在开始用js的时候才发现被float占位了 因为float浮动起来了,我清除了浮动,但是还是占位 然后我同事就告诉我其实可以不用float来左右浮动 在父元素上用display ...
- Oracle数据库共享内存分配不足问题的解决
问题: ORA-: unable to allocate bytes of shared memory ("shared pool,)","session param v ...
- beatfullsoup
阅读目录 一 介绍 二 基本使用 三 遍历文档树 四 搜索文档树 五 修改文档树 六 总结 一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通 ...
- svn服务器配置以及自动同步到web服务器
感觉再不用svn就真的老了. 安装 yum install subversion 新建repo mkdir -p /opt/svn/myrepo svnadmin create /opt/svn/my ...
- CentOS7.5安装截图软件
一.Screenshot tool插件 这个插件直接在https://extensions.gnome.org/搜索,然后打开ON,等待安装完毕,就可以在你桌面的顶栏的右侧看到一个相机一样的小东西 缺 ...
- bzoj 4327 AC自动机
思路:将能跑到的状态标记一下,在bfs搜一下就好啦. #include<bits/stdc++.h> #define LL long long #define ll long long # ...
- GIT的安装及git状态的变更详解
一.安装git环境 (2)Git安装 Centos: yum install -y git Ubuntu: apt-get install git Windows安装git bash软件 注意不要使用 ...
- 开源游戏地图编辑器MarbleMap
开源游戏地图编辑器MarbleMap MIT协议,MarbleMap是一款as3开发的游戏地图编辑器,他免费开源,同时支持Cocos2d-x坐标系和AS3坐标系,功能丰富,不过是一款新推出的开源项目, ...
- 多线程IO模型
服务端编程,首要问题是选取IO模型.即如何处理大量连接,服务更多的客户端? 我们最早有2种解法,各有不足: 1.阻塞IO,每个连接都需要一个线程. 随着连接数增多,线程数剧增,系统开销太大. 2.非阻 ...
- 转:LLVM与Clang的概述及关系
转:http://www.cnblogs.com/saintlas/p/5738739.html LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言 ...