详解如何在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 相关文章推荐
DLL+ ActiveX控件+WEB页面调用例子
Aug 07 Javascript
node.js适合游戏后台开发吗?
Sep 03 Javascript
jQuery判断数组是否包含了指定的元素
Mar 10 Javascript
jquery中JSON的解析方式
Mar 16 Javascript
jQuery获取标签文本内容和html内容的方法
Mar 27 Javascript
JavaScript实现点击按钮直接打印
Jan 06 Javascript
Bootstrap学习笔记之css样式设计(1)
Jun 07 Javascript
利用js获取下拉框中所选的值
Dec 01 Javascript
Jquery on绑定的事件 触发多次实例代码
Dec 08 Javascript
js实现tab切换效果
Feb 16 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
Jun 13 Javascript
ant-design-vue 实现表格内部字段验证功能
Dec 16 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
人大复印资料处理程序_输入篇
2006/10/09 PHP
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
PHP使用适合阅读的格式显示文件大小的方法
2015/03/05 PHP
php实现字符串首字母转换成大写的方法
2015/03/17 PHP
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
javascript实现设置、获取和删除Cookie的方法
2015/06/01 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
微信小程序入门教程
2016/11/18 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
jQuery实用密码强度检测
2017/03/02 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
jQuery遍历节点方法汇总(推荐)
2017/05/13 jQuery
vuex提交state&amp;&amp;实时监听state数据的改变方法
2018/09/16 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
Python中的yield浅析
2014/06/16 Python
用Python给文本创立向量空间模型的教程
2015/04/23 Python
Python对象属性自动更新操作示例
2018/06/15 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
2020/11/10 Python
研发工程师岗位职责
2014/04/28 职场文书
自主招生推荐信范文
2014/05/10 职场文书
学校募捐倡议书
2014/05/14 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
儿子满月酒致辞
2015/07/29 职场文书
深入理解 Golang 的字符串
2022/05/04 Golang