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动画animate方法使用介绍
May 06 Javascript
在父页面调用子页面的JS方法
Sep 29 Javascript
浅谈js的setInterval事件
Dec 05 Javascript
js实现禁止中文输入的方法
Jan 14 Javascript
javascript相关事件的几个概念
May 21 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
Jun 13 Javascript
实例解析Array和String方法
Dec 14 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
Feb 07 Javascript
vue2 自定义动态组件所遇到的问题
Jun 08 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
Jun 13 jQuery
在微信小程序中保存网络图片
Feb 12 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
May 10 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/10 PHP
浅谈php自定义错误日志
2015/02/13 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
Windows 系统下安装和部署Egret的开发环境
2014/07/31 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
Nuxt.js开启SSR渲染的教程详解
2018/11/30 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
Python实现快速多线程ping的方法
2015/07/15 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
Python类及获取对象属性方法解析
2020/06/15 Python
5分钟弄清楚html5的drag and drop(小结)
2019/04/10 HTML / CSS
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
Quiksilver美国官网:始于1969年的优质冲浪服和滑雪板外套
2020/04/20 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
C语言面试题
2013/05/19 面试题
省三好学生申请材料
2014/01/22 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
公益广告标语
2014/06/19 职场文书
首次购房证明
2015/06/19 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript