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
Feb 25 Javascript
js 编程笔记 无名函数
Jun 28 Javascript
从面试题学习Javascript 面向对象(创建对象)
Mar 30 Javascript
jquery 单引号和双引号的区别及使用注意
Jul 31 Javascript
JS父页面与子页面相互传值方法
Mar 05 Javascript
js获取当前日期时间及其它日期操作汇总
Mar 08 Javascript
深入浅析jQuery对象$.html
Aug 22 Javascript
AngularJS实现星星等级评分功能
Sep 24 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
Dec 13 Javascript
BootStrap modal实现拖拽功能
Dec 01 Javascript
微信小程序日历/日期选择插件使用方法详解
Dec 28 Javascript
JavaScript惰性载入函数实例分析
Mar 27 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隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
PHP文件上传类实例详解
2016/04/08 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
javascript window.opener的用法分析
2010/04/07 Javascript
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
JavaScript创建对象的方式小结(4种方式)
2015/12/17 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
python二分法实现实例
2013/11/21 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
python得到单词模式的示例
2018/10/15 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
django 环境变量配置过程详解
2019/08/06 Python
tensorflow自定义激活函数实例
2020/02/04 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
如何现实servlet的单线程模式
2014/08/05 面试题
办公室主任先进事迹
2014/01/18 职场文书
会计专业导师推荐信
2014/03/08 职场文书
个人工作主要事迹
2014/05/08 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
地心历险记观后感
2015/06/15 职场文书
绿里奇迹观后感
2015/06/15 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫