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 相关文章推荐
JQuery下关于$.Ready()的分析
Dec 13 Javascript
Prototype的Class.create函数解析
Sep 22 Javascript
JavaScript中的this关键字介绍与使用实例
Jun 21 Javascript
脚本合并提升javascript性能示例
Feb 24 Javascript
Ajax中解析Json的两种方法对比分析
Jun 25 Javascript
JavaScript闭包实例详解
Jun 03 Javascript
浅谈AngularJs指令之scope属性详解
Oct 24 Javascript
深入理解Vue transition源码分析
Jul 30 Javascript
Vue.extend实现挂载到实例上的方法
May 01 Javascript
webpack 处理CSS资源的实现
Sep 27 Javascript
ES6中Set和Map用法实例详解
Mar 02 Javascript
AJAX实现指定部分页面刷新效果
Oct 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/11/25 PHP
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
看了就知道什么是JSON
2007/12/09 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
2013/04/26 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
JS实现支持Ajax验证的表单插件
2016/03/24 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
小程序实现多列选择器
2019/02/15 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
python读取Android permission文件
2013/11/01 Python
Django Highcharts制作图表
2016/08/27 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
python正则中最短匹配实现代码
2018/01/16 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
python随机数分布random均匀分布实例
2019/11/27 Python
如何基于Python按行合并两个txt
2020/11/03 Python
Python中常用的os操作汇总
2020/11/05 Python
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
大学生写自荐信的技巧
2014/01/08 职场文书
招股说明书范本
2014/05/06 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
python 多态 协议 鸭子类型详解
2021/11/27 Python