我们都知道在js里对象是很容易改变的

  1. var obj1 ={
  2. a:'111'
  3. }
  4.  
  5. obj1.a = '222';
  6. console.log( obj.a ) //output 222 对象的属性发生了变化

现在我们来看看es5 给我提供一个对象的新方法冻结对象(浅冻结)。

Object.freeze(obj) obj是要冻结的对象,Object.freeze()可以防止对象新增属性或方法,防止删除和修改现有的属性和方法。他其实就是让对象变成不可变的数据;

  1. var obj = {
  2. a:'111'
  3. }
  4. Object.freeze( obj );
  5.  
  6. obj.a = '222'
  7.  
  8. console.log( obj.a ); //output 依然是 111 严格模式下会报错 不可修改
  9.  
  10.    obj.b = '222';
  11. console.log( obj.b ) //output undefined 严格模式下会报错 不可新增
  12.  
  13. delete obj.a;
  14.  
  15. console.log( obj.a ) // output 依然是111 严格模式下会报错 不可删除

熟悉js对象(深浅)拷贝的朋友就知道想jQuery extend 的方法第一个参数如果出入的是布尔值true 代表深拷贝,如果忽略直接传入多个对象就代表浅拷贝。其实对象的冻结也是有深冻结和浅冻结之分的。

  1. var obj = {
  2. a:{
  3. achild:'deep'
  4. }
  5. }
  6.  
  7. Object.freeze(obj);
  8.  
  9. //我现在来改变obj对象a下的achild验证一下 Object.freeze()是否还灵验
  10.  
  11. obj.a.achild = 'no effect';
  12.  
  13. console.log( obj.a.achild ) //output no effect; 果然是可以改变的。
  14.  
  15. obj.a.otherchild = 'otherchild';
  16.  
  17. console.log( obj.a.otherchild) //output otherchild 也可以新增
  18.  
  19. delete obj.a.otherchild ;
  20. console.log( obj.a.otherchild) // output undefine obj.a.otherchild 不见了真名删除也是有效的
  21.  
  22. 通过上面的例子我们可以发现Object.freeze(obj) 只可以浅冻结对象 obj.a(浅) obj.a.achild(深)

 那我们想深冻结一个对象怎么办?我也可以通过Object.freeze()的特性自己创建一个深冻结函数。

  1. function deepFreeze(obj) {
  2.  
  3. var propNames = Object.getOwnPropertyNames(obj);
  4.  
  5. propNames.forEach(function(name) {
  6. var prop = obj[name];
  7.  
  8. if (typeof prop == 'object' && prop !== null)
  9. deepFreeze(prop);
  10. });
  11.  
  12. return Object.freeze(obj);
  13. }
  14.  
  15. //现在我们来试验一下我们的函数
  16. var obj = {
  17. a:{}
  18. }
  19. deepFreeze(obj);
  20.  
  21. obj.a.achild = 'achild'
  22.  
  23. console.log( obj.a.achild ) //output undefine 现在实现了深冻结一个对象了

参考文章链接

  1.  

javascript EcmaScript5 新增对象之Object.freeze的更多相关文章

  1. 【转】JavaScript中的对象复制(Object Clone)

    JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b. ...

  2. JavaScript:变量对象(Variable Object)

    引言:在使用JavaScript编程的时候,避免不了声明函数和变量,但是我们很少知道解释器是如何并且在什么地方找到这些函数和变量的,我们在引用这些对象的时候究竟发生了什么? 对ECMAScript程序 ...

  3. ECMAScript5新增对象语法糖getter和setter

    在新的ECMAScript5中新添加了两个语法糖,这两个语法糖是这样的. var obj = (function(){ var num = 10; return { get n(){ return n ...

  4. JavaScript深入理解对象方法——Object.entries()

    Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性) 示例 ...

  5. js,javascript,打印对象,object

    function writeObj(obj){ var description = ""; for(var i in obj){ var property=obj[i]; desc ...

  6. JavaScript 复制对象【Object.assign方法无法实现深复制】

    在JavaScript这门语言中,数据类型分为两大类:基本数据类型和复杂数据类型.基本数据类型包括Number.Boolean.String.Null.String.Symbol(ES6 新增),而复 ...

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

    前面提到 ES5 对象属性描述符,这篇看看对象的扩展.密封和冻结. 扩展对象 Object.preventExtensions Object.isExtensible 密封对象 Object.seal ...

  8. JavaScript 中的对象深度复制(Object Deep Clone)

    JavaScript中并没有直接提供对象复制(Object Clone)的方法. JavaScript中的赋值,其实并不是复制对象,而是类似`c/c++`中的引用(或指针),因此下面的代码中改变对象b ...

  9. javascript的冻结对象之freeze(),isFrozen()方法

    最严格的对象保护措施就是冻结对象了.冻结过后的对象,即不可以扩展,原有对象也不可以删除,因为[Writable]=false,所以对象的属性不可修改. 示例一: var person={name:&q ...

随机推荐

  1. poj1716 Integer Intervals(差分约束)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Integer Intervals Time Limit: 1000MS   Me ...

  2. php 写队列

    这里不得不提到php的数组函数真的是太强大了 队列是先进先出 那么对于数组来说就尾部插入,头部拿出 这里提供方法 尾部插入 我们知道有一个函数array_push 头部拿出 array_shift($ ...

  3. ThinkPhp调用webservice

    模板页: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  4. CentOS 6.4 下安装 Apache

    下载地址:http://mirror.bit.edu.cn/ 参数 描述 prefix 安装目录 enable-rewrite 开启 rewrite 模块 sysconfdir 配置文件目录 ./co ...

  5. Sad Angel (悲伤的天使)-Игорь Крутой

    悲伤的天使(neyanbhbin) -经典作曲Sad Angel( Печальныйангел)生活是一种连续的影响,每个小人物都有小人物的伟大故事.从开头的情侣,到美丽的丝带,从清洁老伯到卖气球的 ...

  6. POJ 1020 Anniversary Cake(DFS)

    Anniversary Cake Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit St ...

  7. RedHat下MySQL 5.6 安装、维护

    准备环境: RedHat 5系统.MySQL 5.6 rpm包 首先 上传mysql至服务器 1. 解压缩MySql [root@localhost]# tar -xvf MySQL-5.6.2_m5 ...

  8. 管理Activity,随时随地控制Activity的销毁工作

    public class ActivityManager { public static List<Activity> activityList = new ArrayList<Ac ...

  9. FileStream类

    使用FileStream能够对对系统上的文件进行读.写.打开.关闭等操作.并对其他与文件相关的操作系统提供句柄操作,如管道,标准输入和标准输出.读写操作可以指定为同步或异步操作.FileStream对 ...

  10. PHP MySQL Select 之Select

    从数据库表中选取数据 SELECT 语句用于从数据库中选取数据. 语法 SELECT column_name(s) FROM table_name 注释:SQL 语句对大小写不敏感.SELECT 与 ...