详解如何在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 相关文章推荐
通过event对象的fromElement属性解决热区设置主实体的一个bug
Dec 22 Javascript
动态添加js事件实现代码
Mar 12 Javascript
js实现文本框中焦点在最后位置
Mar 04 Javascript
Webpack 实现 Node.js 代码热替换
Oct 22 Javascript
jQuery实现标题有打字效果的焦点图代码
Nov 16 Javascript
JavaScript中校验银行卡号的实现代码
Dec 19 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
Jan 19 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
Feb 22 Javascript
jQuery中each遍历的三种方法实例分析
Sep 07 jQuery
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
Sep 14 Javascript
如何安装控制器JavaScript生成插件详解
Oct 21 Javascript
vue项目引入ts步骤(小结)
Oct 31 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防注入代码
2010/04/07 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
python版本五子棋的实现代码
2018/12/11 Python
Python类的动态绑定实现原理
2020/03/21 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
北京某公司的.net笔试题
2014/03/20 面试题
自我评价怎么写正确呢?
2013/12/02 职场文书
部队学习十八大感言
2014/01/11 职场文书
计算机专业毕业生自我鉴定
2014/01/16 职场文书
大二自我鉴定
2014/01/31 职场文书
女娲补天教学反思
2014/02/05 职场文书
教堂婚礼主持词
2014/03/14 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
领导班子奢靡之风查摆问题及整改措施
2014/09/27 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python