详解如何在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 &amp; DHTML 实例编程(教程)基础知识
Jun 02 Javascript
jquery插件tooltipv顶部淡入淡出效果使用示例
Dec 05 Javascript
JavaScript代码应该放在HTML代码哪个位置比较好?
Oct 16 Javascript
如何减少浏览器的reflow和repaint
Feb 26 Javascript
JS实现的数组全排列输出算法
Mar 19 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
Sep 06 Javascript
Bootstrap源码解读表单(2)
Dec 22 Javascript
jQuery中的deferred对象和extend方法详解
May 08 jQuery
浅谈Postman解决token传参的问题
Mar 31 Javascript
JS对象和字符串之间互换操作实例分析
Feb 02 Javascript
vue+php实现的微博留言功能示例
Mar 16 Javascript
微信小程序实现电子签名功能
Jul 29 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
关于手调机和数调机的选择
2021/03/02 无线电
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
PHP中返回引用类型的方法
2015/04/03 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
一个非常实用的php文件上传类
2017/07/04 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
jQuery函数的等价原生函数代码示例
2013/05/27 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
NodeJS使用jQuery选择器操作DOM
2015/02/13 NodeJs
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
Python基于多线程实现ping扫描功能示例
2018/07/23 Python
python读取文本中的坐标方法
2018/10/14 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
英国第一的滑雪服装和装备零售商:Snow+Rock
2020/02/01 全球购物
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
音乐教学案例
2014/01/30 职场文书
食品采购员岗位职责
2014/04/14 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
JS实现扫雷项目总结
2021/05/19 Javascript