详解如何在Javascript中使用Object.freeze()


Posted in Javascript onOctober 18, 2020

Object.freeze()

Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象

用法

const objectExample = {
 prop1: 20,
 prop2: "羊先生"
};

// 默认情况下,我们可以根据需要修改对象的属性
objectExample.prop1 = 100;
console.log(objectExample.prop1)

// 冻结对象
Object.freeze(objectExample);

objectExample.prop2 = "Alice" // 如果在严格模式会抛出失败,在非严格模式下只会抛出异常

console.log(objectExample.prop2);

结果

非严格模式

详解如何在Javascript中使用Object.freeze()

添加严格模式

"use strict";

详解如何在Javascript中使用Object.freeze()

抛出异常提示该属性是只读的

深度冻结

需要注意的是,如果被冻结的对象具有以对象作为值的属性,这些对象可以被更改

const theObject = {
 x: 1,
 z: 2,
 y: {
  a: "Hello",
  b: "羊先生"
 }
}

Object.freeze(theObject);

theObject.x = 100
console.log(theObject.x);

theObject.y.a = 'vipbic';
console.log(theObject.y.a);

结果

详解如何在Javascript中使用Object.freeze()

发现对象第一层是被冻结了,但是第二层并没有被冻结,这意味着我们只实现了「浅冻结」
要通过冻结对象的所有属性(包括那些将其他对象存储为值的属性)来使对象不可变,我们必须执行「深度冻结」—即使用递归在冻结父对象之前冻结子对象。

递归冻结

const theObject = {
 x: 1,
 z: 2,
 y: {
  a: "Hello",
  b: "羊先生"
 }
}

const deepFreeze = (obj) => {

 const propNames = Object.getOwnPropertyNames(obj)

 for (const name of propNames) {
  const value = obj[name];

  if (value && typeof value === "object") { 
   deepFreeze(value);
  }
 }

 return Object.freeze(obj);
}

deepFreeze(theObject);
theObject.y.a = 100;
console.log(theObject.y.a );

结果

详解如何在Javascript中使用Object.freeze()

在Vue中使用Object.freeze

在vue2.0中,当你把一个普通的 JavaScript 对象传给 Vue 实例的  data  选项,Vue 将遍历此对象所有的属性,并使用  Object.defineProperty  把这些属性全部转为 getter/setter,这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化

有时在实际应用中,我们只是用来存储某个对象或者数组,并不要求它响应对应的视图,但在这个过程中vue还是会用object.defineProperty来监听这个数组,这样就是一种性能浪费,所以我们阔以使用Object.freeze来冻结数据

<h4 v-for="(item,idx) in items" :key="idx">{{ item.text }}</h4>
data() {
  let data = Object.freeze([{text:'羊先生'},{text:'ipbic'}])
  return {
    msg: '',
    items:data
  }
},
mounted() {

  this.items[0].text = '分享快乐'; // 界面不会更新

  this.items = [{ text: 'itnavs' },{ text: '分享快乐' }]; // 界面会更新

  this.items = Object.freeze([{ text: 'itnavs' },{ text: '分享快乐' }]); // 界面会更新
},

如果你有一个巨大的数组或Object,并且确信数据不会修改,使用Object.freeze()可以让性能大幅提升。在我的实际开发中,这种提升大约有5~10倍,倍数随着数据量递增

使用Object.freeze从而避免这种资源的浪费,不要看它小,而忽略,不积跬步无以至千里

到此这篇关于详解如何在Javascript中使用Object.freeze()的文章就介绍到这了,更多相关Javascript Object.freeze()内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery AjaxQueue改进步骤
Oct 06 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
Feb 02 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
Jul 31 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
Aug 08 Javascript
js实现收缩菜单效果实例代码
Oct 30 Javascript
js动态控制table的tr、td增加及删除的具体实现
Apr 30 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
Aug 15 Javascript
JS实现图片上传预览功能
Nov 21 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
Jun 22 Javascript
在vue中实现简单页面逆传值的方法
Nov 27 Javascript
简单的Vue SSR的示例代码
Jan 12 Javascript
微信小程序实现收藏与取消收藏切换图片功能
Aug 03 Javascript
从表单校验看JavaScript策略模式的使用详解
Oct 17 #Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
Oct 17 #Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
Oct 16 #Javascript
DWR内存兼容及无法调用问题解决方案
Oct 16 #Javascript
JS pushlet XMLAdapter适配器用法案例解析
Oct 16 #Javascript
jQuery zTree如何改变指定节点文本样式
Oct 16 #jQuery
vue使用swiper实现左右滑动切换图片
Oct 16 #Javascript
You might like
PHP 判断变量类型实现代码
2009/10/23 PHP
php 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
php多文件上传功能实现原理及代码
2013/04/18 PHP
PHP生成Gif图片验证码
2013/10/27 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
laravel多条件查询方法(and,or嵌套查询)
2019/10/09 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
JavaScript 判断指定字符串是否为有效数字
2010/05/11 Javascript
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
vue结合Echarts实现点击高亮效果的示例
2018/03/17 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
python赋值操作方法分享
2013/03/23 Python
python正则表达式re模块详解
2014/06/25 Python
python实现自动发送邮件
2018/06/20 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
Python常用类型转换实现代码实例
2020/07/28 Python
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
先进基层党组织材料
2014/12/25 职场文书
详解Redis基本命令与使用场景
2021/06/01 Redis
Javascript的promise,async和await的区别详解
2022/03/24 Javascript