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 sortable效果 代码有错但值得看看
Nov 05 Javascript
JS解析XML的实现代码
Nov 12 Javascript
js操纵dom生成下拉列表框的方法
Feb 24 Javascript
解决jquery版本冲突的有效方法
Sep 02 Javascript
JavaScript使用Prototype实现面向对象的方法
Apr 14 Javascript
Javascript中判断对象是否为空
Jun 10 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
Jan 27 Javascript
BootstrapValidator超详细教程(推荐)
Dec 07 Javascript
javascript实现非常简单的小数取整功能示例
Jun 13 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
Nov 22 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
Jul 17 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
Aug 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 判断变量类型实现代码
2009/10/23 PHP
PHP 金额数字转换成英文
2010/05/06 PHP
PHP学习之正则表达式
2011/04/17 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
js实现日历与定时器
2017/02/22 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
使用webpack搭建vue环境的教程详解
2019/12/31 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
Python深入学习之上下文管理器
2014/08/31 Python
Python类属性与实例属性用法分析
2015/05/09 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
python 使用get_argument获取url query参数
2017/04/28 Python
TensorFlow在MAC环境下的安装及环境搭建
2017/11/14 Python
python字典一键多值实例代码分享
2019/06/14 Python
python实现快递价格查询系统
2020/03/03 Python
python中altair可视化库实例用法
2021/01/26 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
Allsole美国/加拿大:英国一家专门出售品牌鞋子的网站
2018/10/21 全球购物
远东集团网络工程师面试题
2014/10/20 面试题
大学四年个人自我小结
2014/03/05 职场文书
贷款担保申请书
2014/05/20 职场文书
法语专业求职信
2014/07/20 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
政审证明材料
2015/06/19 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python
Pandas搭配lambda组合使用详解
2022/01/22 Python
使用CSS实现黑白格背景效果
2022/06/01 HTML / CSS