详解如何在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.alert 弹出式复选框实现代码
Jun 15 Javascript
jquery控制listbox中项的移动并排序
Nov 12 Javascript
Javascript开发之三数组对象实例介绍
Nov 12 Javascript
对frameset、frame、iframe的js操作示例代码
Aug 16 Javascript
jquery中邮箱地址 URL网站地址正则验证实例代码
Sep 15 Javascript
zepto.js中tap事件阻止冒泡的实现方法
Feb 12 Javascript
Javascript代码实现仿实例化类
Apr 03 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
Jun 24 Javascript
javascript合并表格单元格实例代码
Jan 03 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
Nov 09 Javascript
浅谈javascript中的 “ &amp;&amp; ” 和 “ || ”
Feb 02 Javascript
使用 Vue 实现一个虚拟列表的方法
Aug 20 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中的Cannot modify header information 问题
2013/08/12 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
Champion官网:美国冠军运动服装
2017/01/25 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
进程的查看和调度分别使用什么命令
2013/12/14 面试题
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
公司大门门卫岗位职责
2014/06/11 职场文书
同意报考公务员证明
2015/06/17 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
Redis RDB技术底层原理详解
2021/09/04 Redis