JavaScript中,我们希望别人无法修改我们创建的对象。比如,代码库的作者很可能想锁定核心库的某些部分来保证它们不被意外地修改。ES5中引入了三种锁定修改的级别:防止扩展preventExtensions密封seal冻结frezze

这三种级别逐渐增强。对于超过级别的行为,在非严格模式下将会悄无声息地失败,在严格模式下将会抛出一个错误。因此,建议使用严格模式,更加方便调试。

正常对象:

可以添加属性和方法,所有属性和方法可以被删除、修改。

var person = {
name: "Nicholas"
};

防止扩展:

禁止为对象添加属性和方法。但已存在的属性和方法可以被修改或删除。

实施操作:Object.preventExtensions()

检测是否应用该操作:Object.isExtensible()

Object.preventExtensions(person);
console.log(Object.isExtensible(person)); // false
person.age = 25; // 防止扩展
console.log(person.age); // undefined

密封:

禁止为对象删除已存在的属性和方法。被密封的对象也是不可扩展的。

实施操作:Object.seal()

检测是否应用该操作:Object.isSealed()

Object.seal(person);
console.log(Object.isExtensible(person)); // false
console.log(Object.isSealed(person)); // true
person.age = 25; // 防止扩展
console.log(person.age); // undefined
delete person.name; // 防止删除
console.log(person.name); // Nicholas

冻结:

禁止为对象修改已存在的属性和方法。所有字段均只读。被冻结的对象也是不可扩展和密封的。

实施操作:Object.freeze()

检测是否应用该操作:Object.isFrozen()

Object.freeze(person);
console.log(Object.isExtensible(person)); // false
console.log(Object.isSealed(person)); // true
console.log(Object.isFrozen(person)); // true
person.age = 25; // 防止扩展
console.log(person.age); // undefined
delete person.name; // 防止删除
console.log(person.name); // Nicholas
person.name = "Greg" // 防止修改
console.log(person.name); // Nicholas

注意:

  • 对于同一个对象,防止扩展-->密封-->冻结这种操作是不可逆的。一旦该对象被冻结,是无法恢复到防止扩展或密封状态的。一旦该对象被密封,是无法恢复到防止扩展状态的。一旦对象被锁定,它将无法解锁。
Object.freeze(person);
person.name = "Greg"; // 防止修改
console.log(person.name); // Nicholas Object.preventExtensions(person); // 无法回退
person.name = "Greg"; // 防止修改
console.log(person.name); // Nicholas
  • Object.seal()方法,会在一个现有对象上调用Object.preventExtensions(),并把所有属性标记为configurable: false
  • Object.freeze()方法,会在一个现有对象上调用Object.seal(),并把所有属性标记为writable: false
  • 深度冻结一个对象是指,首先在这个对象上调用Object.freeze(),然后遍历它引用的所有对象,并且在这些对象上调用Object.freeze()

总结:

添加 删除 修改 实施操作 检测是否应用
防止扩展 x v v Object.preventExtensions() Object.isExtensible()
密封 x x v Object.seal() Object.isSealed()
冻结 x x x Object.freeze() Object.isFrozen()

参考自《编写可维护的JavaScript》、《你不知道的JavaScript(上卷)》

JavaScript阻止修改对象的三种方式的更多相关文章

  1. 反射应用和获取Class对象的三种方式

    一.写一个"框架",可以创建任何对象运行任何方法 1.配置文件 2.使用类加载器ClassLoader,Properties集合是可以和IO流结合使用完成读取和写入数据的集合,方法 ...

  2. Java反射机制(创建Class对象的三种方式)

    1:了解什么是反射机制? 在通常情况下,如果有一个类,可以通过类创建对象:但是反射就是要求通过一个对象找到一个类的名称:   2:在反射操作中,握住一个核心概念: 一切操作都将使用Object完成,类 ...

  3. JDBC 创建连接对象的三种方式 、 properties文件的建立、编辑和信息获取

    创建连接对象的三种方式 //第一种方式 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ ...

  4. [转]javascript指定事件处理程序包括三种方式:

    javascript指定事件处理程序包括三种方式: (1):DOM0级事件处理程序 如: 代码如下: var btn=document.getElementById("mybtn" ...

  5. Java反射机制(创建Class对象的三种方式)

    1:SUN提供的反射机制的类: java.lang.Class<T> java.lang.reflect.Constructor<T> java.lang.reflect.Fi ...

  6. 反射:获取Class对象的三种方式

    获取Class对象的三种方式 package lianxiApril18; /** * 获取Class对象的三种方式 * 1 Object ——> getClass(); * 2 任何数据类型( ...

  7. Java反射获取类对象的三种方式

    package demo01; /* * 获取一个类的class文件对象的三种方式 * 1.对象获取 * 2.类名获取 * 3.Class类的静态方法获取 */ public class Reflec ...

  8. Java反射获取class对象的三种方式,反射创建对象的两种方式

    Java反射获取class对象的三种方式,反射创建对象的两种方式 1.获取Class对象 在 Java API 中,提供了获取 Class 类对象的三种方法: 第一种,使用 Class.forName ...

  9. 3、获取Class对象的三种方式

    3.获取Class对象的三种方式 要想对字节码文件进行解刨,必须要有字节码文件对象 Object类中的getClass方法 通过对象静态属性 .class来获取对应的Class对象 只要通过给定类的字 ...

随机推荐

  1. java设计模式之适配器模式以及在java中作用

    适配器作用就是讲一个接口适配到另一个接口,在Java 的I/O类库中有很多这样的需求,如将字符串数据转变成字节数据保存到文件中,将字节数据转变成流数据等. 以InputStreamReader和Out ...

  2. BZOJ 3531 SDOI2014 旅行 树链剖分+线段树动态开点

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3531 题意概述: 给出一棵N个点的树,树上的每个结点有一个颜色和权值,支持以下四种操作: ...

  3. BZOJ 3998 TJOI2015 弦论 后缀自动机+DAG上的dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3998 题意概述:对于一个给定长度为N的字符串,求它的第K小子串是什么,T为0则表示不同位置 ...

  4. Nginx+tomcat+redis集群共享session实现负载均衡

    1.nginx是一款轻量级兼备高性能的Http和反向代理服务器.所谓反向代理就是指用户发起访问请求,由代理服务器接受,然后将请求转发给正式服务器,并且将正式服务器处理完的数据返回给客户单,此时代理服务 ...

  5. 手动修改PHP页面返回状态码

    <?php //比如当前页面要返回404状态码 header("HTTP/1.1 404 Not Found"); header("Status: 404 Not ...

  6. charles和Fiddler感觉哪个更好用

    1.fiddler还可以抓HTTPS的包,解析出来都可以     2.charles更直观,可能是我先用charles的缘故.charles遍历一个站点,可以右键另存,保存全站文件资源.扒站首选, c ...

  7. Chrome Extension & Dark Theme

    Chrome Extension & Dark Theme https://chrome.google.com/webstore/detail/eimadpbcbfnmbkopoojfekhn ...

  8. React & shit Antd

    React & shit Antd https://ant.design/components/tooltip-cn/ https://ant.design/components/tag-cn ...

  9. 【bzoj2815】[ZJOI2012]灾难 拓扑排序+倍增LCA

    题目描述(转自洛谷) 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物 ...

  10. Partial Class部分类

    Partial Class,部分类 或者分布类.顾名思义,就是将一个类分成多个部分.比如说:一个类中有3个方法,在VS 2005将该类中3个方法分别存放在3个不同的.cs文件中.这样做的好处:1.一个 ...