继续第二部分

Object.freeze(obj)

看字面意思就是“把一个对象冻结”。

下面我们来看个简单的例子以作说明:

     // a person instance
var person = {
name: 'Andrew',
job: 'sales manager'
}; // before freeze
// existing properties maybe be changed or removed, new properties may be added
person.name = 'Bruce';
person.age = 30; console.log(person.name); // Bruce
console.log(person.age); // // freeze the person
Object.freeze(person); // isFrozen
console.log( Object.isFrozen(person) ); // true // after freeze
// fail silently, or strict mode throw a TypeError
person.name = 'James';
person.age = '35';
person.gender = 'male'; console.log(person.name); // Bruce
console.log(person.age); //
console.log(person.gender); // undefined

上面例子的特点是,person对象的属性像name,job,age的值都是“字面值”,并非对象,如果存在一个属性,其值是一个对象呢?

我们再来一个例子:

     // a person again
var person = {
name: {
firstname: 'Bruce',
lastname: 'Lee'
},
age: 35,
job: 'sales manager',
children: ['lucy', 'linda']
}; console.log('name:' + person.name.firstname + ' ' + person.name.lastname); // name:Bruce Lee
console.log('children:' + person.children); // lucy, linda // freeze the person
Object.freeze(person); // has been frozen!
console.log(Object.isFrozen(person)); // change name
person.name.firstname = 'Andrew';
person.name.lastname = 'Carnegie'; // add one more child
person.children.push('Tom'); console.log('name:' + person.name.firstname + ' ' + person.name.lastname); // name:Andrew Carnegie
console.log('children:' + person.children); // lucy, linda, Tom

通过上面的2个例子,我们很容易得出结论。那么我们如何做到“深层”freeze呢。

就要用到一个递归函数,来让里面的每个对象都被freeze:

     function deepFreeze(o) {
var prop, propkey; Object.freeze(o); for(propkey in o) {
prop = o[propkey]; if( !o.hasOwnProperty(propkey) || !(typeof prop === 'object') || Object.isFrozen(prop) ) {
continue;
}
// Recursively call deepFreeze
deepFreeze(prop);
}
}; // if we use deepFreeze to replace with Object.freeze in the previous example,
// then nothing will happen, even person's properties(aka. name, age, children ) are changed

利用的deepFreeze方法,我们就可以把person对象的属性全部“冻结”。


搞清楚Object.freeze的用途后,我们继续来了解下Object.seal

Object.seal(obj)

seal从字面意思上理解有“密封”的意思,我依旧通过例子来说明:

     // a person again
var person = {
name: 'Andrew',
age: 25,
children: ['Tom'],
edu: {
major: 'computer science',
university: 'Yale'
}
}; // before seal
// new properties may be added, exisiting properties may be changed or removed
person.name = 'Bruce';
person.gender = 'male';
delete person.age; // looking up the structure
console.dir(person); // seal the person
Object.seal(person); // has been sealed
console.log( Object.isSealed(person) ); // true // after seal
// existing (writable) properties can be changed
person.name = 'Jackson';
console.log(person.name); // Jackson // or change value through Object.defineProperty
Object.defineProperty(person, 'name', {value: 'Ann'});
console.log(person.name); // Anna // add one more child
person.children.push('lucy');
console.log(person.children); // tom, lucy // internal object is still extensible, unless you seal it too (eg. Object.seal(person.edu) )
person.edu.degree = 'master';
console.log(person.edu.degree); // master // silently fail or in strict mode throw TypeError
// when add or delete property
person.job = 'Front End Developer';
delete person.name;
// TypeError when add property through Object.defineProperty
Object.defineProperty(person, 'job', {value: 'teacher'}); // TypeError

通过上面的例子,我们可以看到,seal一个对象后,使得它不可扩展,但是其属性值(该属性writable为true)是 可以改变的。还有一点就是若其属性是一个对象,姑且叫内部对象吧,那么这个内部对象还是可以进行扩展的,除非写一个递归的deepSeal方法, 这个可以参考上面的deepFreeze

第二部分就到这里,感兴趣的同学可以前往MDN查看,Object.freezeObject.seal

ECMAScript5之Object学习笔记(二)的更多相关文章

  1. ECMAScript5之Object学习笔记(一)

    随着IE的逐步追赶,目前到IE11已经能够很好的支持ECMAScript5标准了,其他的现代浏览器像firefox,chrome,opera就更不用说了. 再加上nodejs使得javascript在 ...

  2. ECMAScript5之Object学习笔记(三)

    第三部分继续... Object.getOwnPropertyDescriptor(obj, prop) 获取一个对象的属性描述符 根据"Own"这个词我们可以猜到,prop只能是 ...

  3. JavaScript Object学习笔记二

    Object.create(proto, [propertiesObject])//创建对象,使用参数一来作为新创建对象的__proto__属性,返回值为在指定原型对象上添加自身属性后的对象 //参数 ...

  4. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  5. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  6. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  7. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...

  9. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

随机推荐

  1. 1025 PAT Ranking (25)(25 point(s))

    problem Programming Ability Test (PAT) is organized by the College of Computer Science and Technolog ...

  2. python opencv3 人脸识别的例子

    一个人脸识别的例子 程序中用到了公共数据集, 欢迎去我的git上下载源码,源码里带有数据集 git:https://github.com/linyi0604/Computer-Vision 脚本中一个 ...

  3. SPOJ7586 NUMOFPAL manacher算法

    题目大意: 求一个串中有多少个回文子串 这..... 妥妥的模板题吧.... 对所有的$r[i] / 2$进行求和即可,其中,$r[i]$为以$i$为中心的回文半径 $r[i] / 2$怎么来的,画下 ...

  4. 【Floyd(并非水题orz)】BZOJ4093-[Usaco2013 Dec]Vacation Planning

    最近刷水太多标注一下防止它淹没在silver的水题中……我成为了本题,第一个T掉的人QAQ [题目大意] Bovinia设计了连接N (1 < = N < = 20,000)个农场的航班. ...

  5. 课下测试ch17&ch18

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

  6. Python编码规则

    1. 命名规则 1.1 变量名.包名.模块名 变量名通常有字母.数字和下划线组成,且首字母必须是字母或下划线,并且不能使用python的保留字:包名.模块名通常用小写字母 1.2 类名.对象名 类名首 ...

  7. BZOJ 1059: [ZJOI2007]矩阵游戏 匈牙利算法

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2351  Solved: 1156 题目连接 http:// ...

  8. Codeforces Round #293 (Div. 2) A. Vitaly and Strings

    A. Vitaly and Strings time limit per test 1 second memory limit per test 256 megabytes input standar ...

  9. bestcoder#23 1001 Sequence

    Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  10. 重温PHP之冒泡排序

    冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交换过来.走 ...