ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)

前面提到 ES5 对象属性描述符,这篇看看对象的扩展、密封和冻结。

  1. 扩展对象
  2. Object.preventExtensions
  3. Object.isExtensible
  4. 密封对象
  5. Object.seal
  6. Object.isSealed
  7. 冻结对象
  8. Object.freeze
  9. Object.isFrozen

1. Object.preventExtensions

阻止对象扩展,让一个对象变的不可扩展,也就是永远不能再添加新的属性

ES3 是没有办法阻止对象扩展的,定义对象后可以给对象添加任意属性,如

javascript;gutter:true; var obj = {name: 'John'}</p> <p>// 又添加一个属性 age obj.age = 30</p> <p>// 又添加一个方法 obj.setAge = function(a) { this.age = a }</p> <pre><code> ES5 的 Object.preventExtensions 则可以阻止给对象添加新属性 ;gutter:true;
var obj = {name: ‘John’}

// 阻止对象扩展
Object.preventExtensions(obj)

// 添加新属性
obj.age = 30

// 测试新属性,是 undefined,表明未添加成功
console.log(obj.age)

如果严格模式,则会报错

javascript;gutter:true; 'use strict' var obj = {name: 'John'} Object.preventExtensions(obj) obj.age = 30</p> <pre><code> 如图 ![ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/114013-20160315105211553-540575868.jpg) ### 2. Object.isExtensible 判断一个对象是否可扩展,即是否可以给它添加新属性 默认普通对象都是可以扩展的,这和 ES3 保持一致 ;gutter:true;
var obj = {}

// true,表示可扩展
Object.isExtensible(obj)

但调用 ES5 的 Object.preventExtensions 后就返回 false 了

javascript;gutter:true; var obj = {} Object.preventExtensions(obj)</p> <p>// false,表示不可添加新属性 Object.isExtensible(obj)</p> <pre><code> ### 3. Object.seal 让一个对象密封,并返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可以修改已有属性的值的对象。 测试:添加新属性 ;gutter:true;
var obj = {name: ‘John’}

// 密封
Object.seal(obj)

// 不能添加新属性
obj.age = 30
console.log(obj.age) // undefined

测试:删除已有属性

javascript;gutter:true; var obj = {name: 'John'}</p> <p>// 密封 Object.seal(obj)</p> <p>// 不能删除已有属性 delete obj.name // false console.log(obj.name) // 'John',依然存在</p> <pre><code> 测试:修改已有属性的可枚举性、可配置性、可写性 ;gutter:true;
var obj = {name: ‘John’}

// 密封
Object.seal(obj)

// 修改已有的配置属性
Object.defineProperty(obj, ‘name’, {
configurable: true,
writable: true,
enumerable: true
})

浏览器提示报错

ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)

测试:修改已有属性的值

javascript;gutter:true; var obj = {name: 'John'}</p> <p>// 密封 Object.seal(obj)</p> <p>// 可以修改已有属性的值 obj.name = 'Backus' console.log(obj.name) // 'Backus'</p> <pre><code> ### 4. Object.isSealed 判断一个对象是否是密封的(sealed) 普通对象是非密封的,和 ES3 保持一致 ;gutter:true;
var obj = {}
Object.isSealed(obj) // false

调用 Object.seal 的对象是密封的

javascript;gutter:true; var obj = {} Object.seal(obj) Object.isSealed(obj) // true</p> <pre><code> ### 5. Object.freeze 这个方法比 Object.seal 更绝,冻结对象是指那些不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。也就是说,这个对象永远是不可变的。 测试:添加新属性 ;gutter:true;
var obj = {name: ‘John’}
Object.freeze(obj)
obj.age = 30
console.log(obj.age) // undefined

不能添加 age 属性,表明被冻结的对象不能添加新属性。如果是严格模式则报错,如图

ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)

测试:修改已有属性

javascript;gutter:true; var obj = {name: 'John'} Object.freeze(obj) obj.name = 'Backus' console.log(obj.name) // 'John'</p> <pre><code> 想修改为 "Backus",输出依然是 "John",表明不能修改已有属性。如果是严格模式则报错,如图 ![ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/114013-20160315131142099-490843945.jpg) 测试:删除已有属性 ;gutter:true;
var obj = {name: ‘John’}
Object.freeze(obj)
delete obj.name
console.log(obj.name) // ‘John’

想删除 “name” 属性,输出依然是 “John”,表明不能删除已有属性。如果是严格模式则报错,如图

ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)

测试:修改已有属性的可枚举性、可配置性、可写性

javascript;gutter:true; var obj = {name: 'John'} Object.freeze(obj) Object.defineProperty(obj, 'name', { configurable: true, writable: true, enumerable: true })</p> <pre><code> 这个在非严格模式中就报错了,表明 configurable/writable/enmuerable 不能修改,如图 ![ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/114013-20160315131259396-1910878994.jpg) ### 6. Object.isFrozen 判断一个对象是否被冻结(frozen) 普通对象是非冻结的,和 ES3 保持一致 ;gutter:true;
var obj = {name: ‘John’}
Object.isFrozen(obj) // false

调用 Object.freeze 的对象是冻结的

javascript;gutter:true;
var obj = {name: 'John'}
Object.freeze(obj)
Object.isFrozen(obj) // true

Original: https://www.cnblogs.com/snandy/p/5278474.html
Author: snandy
Title: ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/553517/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java学习之Filter与Listener

    web中的Filiter:当客户端访问服务端资源的时候,过率器可以把请求拦截下来,完成一些特殊的功能完成的操作一般都是通用的作用:列如登录验证。web中的Listener一般用于加…

    技术杂谈 2023年6月21日
    097
  • 二十、反射(完结)

    二十、反射 20.1 类的加载 20.1.1 类的加载概述 程序运行后,某个类在第一次使用时,会将该类的 class 文件读取到内存,并将此类的所有信息存储到一个 Class 对象…

    技术杂谈 2023年7月11日
    073
  • Java动态脚本Groovy获取Bean(奇淫技巧操作)

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 背景: 在Java代码中当我们需要一个Bean对象,通常会使用spring中@Autowired注解,用来自动装配…

    技术杂谈 2023年7月11日
    063
  • PowerBI开发 第二十篇:用自然语言来探索数据–Q&A

    Power BI报表的用户,肯定会被Q&A的功能惊艳到,在查看报表时,仅仅通过输入文本就可以探索数据,并且结果是可视化的,更令人惊艳的时,结果几乎是实时显示出来的。这使得Q…

    技术杂谈 2023年5月31日
    0105
  • MAC查看网络端口、进程使用情况

    查看所有TCP连接 lsof -nP -iTCP 查看所有TCP中的LISTEN连接 lsof -nP -iTCP -sTCP:LISTEN 查看某个进程的所有网络状态 lsof …

    技术杂谈 2023年6月1日
    085
  • IDEA:库源与类的字节码不匹配

    在我配置pom.xml文件后,进行代码编辑,发现引入的方法并不是想要的内容,然后我就进入下载源码后进入到源码中发现我想要的方法和导入的jar包内的源码方法并不相同 ,于是到jar的…

    技术杂谈 2023年6月21日
    082
  • 迷宫问题详解(数据结构实验)

    实验项目 2: 栈结构及其应用 实验题目: 迷宫问题求解 实验内容: 一个迷宫可以看成是由 m × n 个房间组成的矩形,迷宫内部的每个房间有 4个方向,每个方向或者有障碍(如墙)…

    技术杂谈 2023年7月11日
    0123
  • 【SSM框架】Mybatis笔记 – MyBatis 中应用动态代理;#{}占位符与${}占位符;执行DML后返回主键值;UUID

    讲义: 一、动态代理: 1、动态代理存在的意义: 在三层架构中,业务逻辑层要通过接口访问数据访问层的功能,动态代理可以实现。 2、动态代理的实现规范: 1)UsersMapper….

    技术杂谈 2023年7月10日
    069
  • maven-排查包冲突

    原因:A系统 引用B系统的功能,但是B系统有一个redis需要排除,在已经排除的情况下,还是无效,出现redis存在问题。 解决方法: 需要用到maven查询结构树 去排查 到底j…

    技术杂谈 2023年7月24日
    088
  • TOC工具Table of content

    工具 doctoc npm install -g doctoc doctoc xxx.md posted @2020-05-03 20:09 脚本小娃子 阅读(304 ) 评论()…

    技术杂谈 2023年5月31日
    0100
  • 大流量、业务效率?从一个榜单开始

    原创不易,求分享、求一键三连 业务场景 之前在一家直播团队做过一段时间的营收部门负责人,榜单是直播平台最通用的一种玩法,可以彰显用户的身份,刺激用户之间的pk,从而增加平台的营收,…

    技术杂谈 2023年6月1日
    090
  • 使用input+datalist简单实现实时匹配的可编辑下拉列表-并解决选定后浏览器默认只显示value的可读性问题

    问题背景 最近小伙伴提了一个希望提高后台下拉列表可操作性的需求,原因是下拉列表选项过多,每次下拉选择比较费时费力且容易出错,硬着头皮啃了啃前端知识,网上搜寻了一些下拉列表实现的资料…

    技术杂谈 2023年6月21日
    079
  • 索引?

    索引包含一个或多个列的值。MySql只能高效的利用索引的最左前缀列。索引的优势: 减少查询扫描的数据量 避免排序和零时表 将随机IO变为顺序IO (顺序IO的效率高于随机IO) B…

    技术杂谈 2023年5月31日
    0104
  • 关于CPU的一些基本知识总结

    关于CPU和程序的执行 CPU是计算机的大脑。 程序的运行过程,实际上是程序涉及到的、未涉及到的一大堆的指令的执行过程。 当程序要执行的部分被装载到内存后,CPU要从内存中取出指令…

    技术杂谈 2023年5月31日
    0125
  • Redis集群(三)集群模式

    一、 集群的作用 集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。 集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点…

    技术杂谈 2023年7月24日
    094
  • 架构设计之数据分片

    数据分片技术作为目前架构设计中处理大数据的一种常规手段,当前被广泛用于缓存、数据库、消息队列等中间件的开发与使用当中,例如在数据量较大的项目当中,系统的性能瓶颈主要来自于与数据库的…

    技术杂谈 2023年7月25日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球