JS Object构造函数之Object.freeze


Posted in Javascript onApril 28, 2021

概述

Object.freeze(obj)可以冻结一个对象。一个被冻结的对象再也不能被修改;

冻结了一个对象则不能向这个对象添加新的属性,不能删除已经属性,不能修改该对象已有属性的可枚举性、可配置性、可写性、以及不能修改已有属性的值。

此外,冻结一个对象后该对象的原型也不能被修改。freeze()返回和传入的参数是相同的对象。

JavaScriptDemo: Object.freeze()

const obj = {
  prop:42
}
Object.freeze(obj)

obj.prop = 33 // 严格模式下会抛出错误。

console.log(obj.prop) // 42

示例

1) 冻结对象

var obj = {
  prop: function() {},
  foo:'bar'
}

// 作为参数传递的对象与返回的对象都被冻结
// 所以不必保存返回的对象 (因为两个对象全等)
var o = Object.freeze(obj)
o === obj // true

// 现在开始任何改变都将失效

obj.foo = ‘he' //不做任何事
Obj.hxx = 'he' // 不添加此属性

// 试图通过Object.defineProperty 更改属性
// 下面两个语句都会抛出异常
Object.defineProperty(obj,'foo',{value:'yy'})
Object.defineProperty(obj,'sex',{value:'女'})

// 也不能更改原型
// 下面两个语句都会抛出异常
Object.setPrototypeOf(obj,{x:20})
Obj.__prorp__ = {x:20}

2) 冻结数组

let a = [0]
Object.freeze(a) // 现在数组不能被更改了

a[0] = 1 // 失败
a.push(2) // 失败

被冻结的对象是不可改变的。但也不总是这样。下面展示了冻结对象不是常量对象(浅冻结)

3) 浅冻结

let obj = {
  internal: {}
}

Object.freeze(obj)
obj.internal.a = ‘he'
console.log(obj.internal.a) // he

要使对象不可变,需要递归冻结每个类型为对象的属性(深冻结)

4) 深冻结

deepFreeze = (obj) => {
  var propNames = Object.getOwnPropertyNames(obj);
  propNames.forEach(function (name) {
    var prop = obj[name];
    if (typeof prop == 'object' && prop !== null) {
      deepFreeze(prop);
    }
  });
  Object.freeze(obj);
}


deepFreeze1 = (obj) => {
  var prop, propName
  Object.freeze(obj)
  for (propName in obj) {
    prop = obj[propName]
    if (!obj.hasOwnProperty(propName) || !(typeof prop === "object") || Object.isFrozen(prop)) {
      // 跳过原型链上的属性和已冻结的对象.
      continue
    }
    deepFreeze1(prop)
  }
}

深冻结的用处一般我们在需要一个属性,但是一开始它为空或者不存在,那么你仅需要设置一些初始值

title: "楼层销售",
value: "",
options: [],

存在的意义

如果你有一个巨大的数组或者Object,并且确定数据不会改变,使用Object.freeze()可以让性能大幅度提升。Object.freeze()冻结的是值,你仍然可以将变量的引用替换掉。

new vue({
  data: {
    // vue不会对list里的object做getter、setter绑定
    list: Object.freeze([
      { value: 1 },
      { value: 2 }
    ])
  },
  mounted () {
     // 界面不会有响应
     this.list[0].value = 100;


     // 下面两种做法,界面都会响应
     this.list = [
       { value: 100 },
       { value: 200 }
     ];
     this.list = Object.freeze([
       { value: 100 },
       { value: 200 }
     ]);
  }
})

以上就是JS Object构造函数之Object.freeze的详细内容,更多关于JS Object.freeze的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JS打开图片另存为对话框实现代码
Dec 26 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
Apr 26 Javascript
使用js简单实现了tree树菜单
Nov 20 Javascript
js鼠标点击图片切换效果代码分享
Aug 26 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
Oct 16 Javascript
JS上传组件FileUpload自定义模板的使用方法
May 10 Javascript
JS代码实现根据时间变换页面背景效果
Jun 16 Javascript
Javascript农历与公历相互转换的简单实例
Oct 09 Javascript
JavaScript实现图片轮播组件代码示例
Nov 22 Javascript
js设置随机切换背景图片的简单实例
Nov 12 Javascript
浅谈js获取ModelAndView值的问题
Mar 28 Javascript
js仿淘宝放大镜效果
Dec 28 Javascript
关于vue中如何监听数组变化
vue实现简单数据双向绑定
Apr 28 #Vue.js
JS异步堆栈追踪之为什么await胜过Promise
Apr 28 #Javascript
vue引入Excel表格插件的方法
Apr 28 #Vue.js
react如何快速设置文件路径别名
原生JS封装vue Tab切换效果
vue项目两种方式实现竖向表格的思路分析
You might like
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
JavaScript的漂亮的代码片段
2013/06/05 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
mint-ui在vue中的使用示例
2018/04/05 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
快速了解Python相对导入
2018/01/12 Python
Python matplotlib绘图可视化知识点整理(小结)
2018/03/16 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
2020/03/06 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
免税水晶:Duty Free Crystal
2019/05/13 全球购物
阿里巴巴Oracle DBA笔试题答案-备份恢复类
2013/11/20 面试题
linux面试相关问题
2012/08/11 面试题
小班秋游活动方案
2014/02/22 职场文书
学雷锋演讲稿
2014/03/04 职场文书
我们的节日清明节活动方案
2014/03/05 职场文书
文明城市创建标语
2014/06/16 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
检讨书格式
2015/01/23 职场文书
应聘教师求职信范文
2015/03/20 职场文书