详解如何在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 引发两次$(document.ready)事件
Jan 15 Javascript
jQuery 定时局部刷新(setInterval)
Nov 19 Javascript
jQuery 快速结束当前正在执行的动画
Nov 20 Javascript
Google (Local) Search API的简单使用介绍
Nov 28 Javascript
js中开关变量使用实例
Feb 24 Javascript
详解本地Node.js服务器作为api服务器的解决办法
Feb 28 Javascript
微信小程序 在线支付功能的实现
Mar 14 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
Mar 21 jQuery
JavaScript文本特效实例小结【3个示例】
Dec 22 Javascript
如何在Angular应用中创建包含组件方法示例
Mar 23 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
Apr 02 Javascript
javaScript把其它类型转换为Number类型
Oct 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
关于Intype一些小问题的解决办法
2008/03/28 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
php 中的closure用法详解
2017/06/12 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
jquery异步调用页面后台方法&amp;#8207;(asp.net)
2011/03/01 Javascript
使用jquery+CSS实现控制打印样式
2014/12/31 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
浅谈javascript中的Function和Arguments
2016/08/30 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
React组件生命周期详解
2017/07/03 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
three.js实现圆柱体
2018/12/30 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
Steve Madden官网:美国鞋类品牌
2017/01/29 全球购物
猎人靴英国官网:Hunter Boots
2017/02/02 全球购物
Why we need EJB
2016/10/20 面试题
高校自主招生自荐信
2013/12/09 职场文书
七匹狼男装广告词
2014/03/21 职场文书
健康家庭事迹材料
2014/05/02 职场文书
农村门前三包责任书
2014/07/25 职场文书
2015年维修电工工作总结
2015/04/25 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
使用JS实现简易计算器
2021/06/14 Javascript
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python
Python之基础函数案例详解
2021/08/30 Python