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 相关文章推荐
通过JAVAScript实现页面自适应
Jan 19 Javascript
利用javascript实现一些常用软件的下载导航
Aug 03 Javascript
javascript 节点遍历函数
Mar 28 Javascript
一个简单的弹性返回顶部JS代码实现介绍
Jun 09 Javascript
jQuery中DOM操作实例分析
Jan 23 Javascript
Jquery插件easyUi实现表单验证示例
Dec 15 Javascript
JS实现去除数组中重复json的方法示例
Dec 21 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
Mar 22 Javascript
vue2中使用less简易教程
Mar 27 Javascript
微信小程序实现顶部导航特效
Jan 28 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
May 20 Javascript
原生js生成图片验证码
Oct 11 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 文件上传系统手记
2009/10/26 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
PHP对象相关知识总结
2017/04/09 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
简单的分页代码js实现
2016/05/17 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
canvas简单快速的实现知乎登录页背景效果
2017/05/08 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
pandas object格式转float64格式的方法
2018/04/10 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
2019/02/28 Python
在django admin中添加自定义视图的例子
2019/07/26 Python
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
亲属关系公证书
2014/04/08 职场文书
社区义诊活动总结
2014/04/30 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js