详解如何在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 相关文章推荐
javascript 常用关键字列表集合
Dec 04 Javascript
javascript TextArea动态显示剩余字符
Oct 22 Javascript
兼容FF和IE的动态table示例自写
Oct 21 Javascript
javascript 获取元素样式必杀技
May 04 Javascript
js预加载图片方法汇总
Jun 15 Javascript
详细分析JavaScript变量类型
Jul 08 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
Sep 25 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
Jan 30 Javascript
纯js实现手风琴效果代码
Apr 17 Javascript
Bootstrap table右键功能实现方法
Feb 20 Javascript
Vuex提升学习篇
Jan 11 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
Dec 13 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学习笔记(三)操作符与控制结构
2011/08/06 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
BootStrap智能表单demo示例详解
2016/06/13 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
纯js实现悬浮按钮组件
2016/12/17 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
Python发送Email方法实例
2014/08/21 Python
Django实现自定义404,500页面教程
2017/03/26 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
简单了解python单例模式的几种写法
2019/07/01 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
解决python -m pip install --upgrade pip 升级不成功问题
2020/03/05 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
计算机应用毕业生自荐信
2013/10/23 职场文书
邓小平理论心得体会
2014/09/09 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
民事答辩状范本
2015/05/21 职场文书
南京大屠杀观后感
2015/06/02 职场文书
有关信念的名言语录集锦
2019/12/06 职场文书
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL