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 序列化对象实现代码
Dec 18 Javascript
往光标所在位置插入值的js代码
Sep 22 Javascript
22点关于jquery性能优化的建议
May 28 Javascript
深入学习JavaScript中的Rest参数和参数默认值
Jul 28 Javascript
jQuery soColorPacker 网页拾色器
Jun 22 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
Nov 25 Javascript
基于webpack 实用配置方法总结
Sep 28 Javascript
原生JS获取元素的位置与尺寸实现方法
Oct 18 Javascript
vue路由懒加载的实现方法
Mar 12 Javascript
ES6 Map结构的应用实例分析
Jun 26 Javascript
使用React代码动态生成栅格布局的方法
May 24 Javascript
小程序实现密码输入框
Nov 16 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 编程请选择正确的文本编辑软件
2006/12/21 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
php实现微信支付之企业付款
2018/05/30 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
深入理解javascript中return的作用
2013/12/30 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
Vue常用API、高级API的相关总结
2021/02/02 Vue.js
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
python 读取文件并替换字段的实例
2018/07/12 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
python批量处理文件或文件夹
2020/07/28 Python
详解Python3定时器任务代码
2019/09/23 Python
django中media媒体路径设置的步骤
2019/11/15 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
浅析Python 条件控制语句
2020/07/15 Python
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
军训考核自我鉴定
2014/02/13 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
房屋租赁协议书(标准版)
2014/10/02 职场文书
分析并发编程之LongAdder原理
2021/06/29 Java/Android
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技