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去除右边逗号的简单方法
Jul 03 Javascript
JS实现网站菜单拖拽移位效果的方法
Sep 24 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
Jun 13 Javascript
node.js实现快速截图
Aug 27 Javascript
Ajax基础知识详解
Feb 17 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
Mar 29 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
Mar 07 Javascript
详解使用 Node.js 开发简单的脚手架工具
Jun 08 Javascript
微信小程序实现多选删除列表数据功能示例
Jan 15 Javascript
JavaScript如何把两个数组对象合并过程解析
Oct 10 Javascript
js实现的在本地预览图片功能示例
Nov 09 Javascript
通过原生vue添加滚动加载更多功能
Nov 21 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+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
PHP Ajax实现页面无刷新发表评论
2007/01/02 PHP
php中取得文件的后缀名?
2012/02/20 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
js下利用控制器载入对应脚本
2010/07/17 Javascript
Jquery 点击按钮显示和隐藏层的代码
2011/07/25 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
javascript 处理null及null值示例
2014/06/09 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
2016/01/14 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
2017/05/17 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
vue+elementUI动态生成面包屑导航教程
2019/11/04 Javascript
[03:40]2014DOTA2国际邀请赛 B神专访:躲箭真的很难
2014/07/13 DOTA
在Python的Django框架中创建和使用模版
2015/07/15 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
3个用于数据科学的顶级Python库
2018/09/29 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
晚会邀请函范文
2014/01/24 职场文书
《雪儿》教学反思
2014/04/17 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
2014年团工作总结
2014/11/27 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书