es6 Object的几个新方法
- 扩展对象
- Object.preventExtensions
- Object.isExtensible
- 密封对象
- Object.seal
- Object.isSealed
- 冻结对象
- Object.freeze
- Object.isFrozen
1. Object.preventExtensions
阻止对象扩展,让一个对象变的不可扩展,也就是永远不能再添加新的属性
ES3 是没有办法阻止对象扩展的,定义对象后可以给对象添加任意属性,如
|
1
2
3
4
5
6
7
8
9
|
var obj = {name: 'John'}// 又添加一个属性 ageobj.age = 30// 又添加一个方法obj.setAge = function(a) { this.age = a} |
ES5 的 Object.preventExtensions 则可以阻止给对象添加新属性
|
1
2
3
4
5
6
7
8
9
10
|
var obj = {name: 'John'}// 阻止对象扩展Object.preventExtensions(obj)// 添加新属性obj.age = 30// 测试新属性,是 undefined,表明未添加成功console.log(obj.age) |
如果严格模式,则会报错
|
1
2
3
4
|
'use strict'var obj = {name: 'John'}Object.preventExtensions(obj)obj.age = 30 |
如图

2. Object.isExtensible
判断一个对象是否可扩展,即是否可以给它添加新属性
默认普通对象都是可以扩展的,这和 ES3 保持一致
|
1
2
3
4
|
var obj = {}// true,表示可扩展Object.isExtensible(obj) |
但调用 ES5 的 Object.preventExtensions 后就返回 false 了
|
1
2
3
4
5
|
var obj = {}Object.preventExtensions(obj)// false,表示不可添加新属性Object.isExtensible(obj) |
3. Object.seal
让一个对象密封,并返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可以修改已有属性的值的对象。
测试:添加新属性
|
1
2
3
4
5
6
7
8
|
var obj = {name: 'John'}// 密封Object.seal(obj)// 不能添加新属性obj.age = 30console.log(obj.age) // undefined |
测试:删除已有属性
|
1
2
3
4
5
6
7
8
|
var obj = {name: 'John'}// 密封Object.seal(obj)// 不能删除已有属性delete obj.name // falseconsole.log(obj.name) // 'John',依然存在 |
测试:修改已有属性的可枚举性、可配置性、可写性
|
1
2
3
4
5
6
7
8
9
10
11
|
var obj = {name: 'John'}// 密封Object.seal(obj)// 修改已有的配置属性Object.defineProperty(obj, 'name', { configurable: true, writable: true, enumerable: true}) |
浏览器提示报错

测试:修改已有属性的值
|
1
2
3
4
5
6
7
8
|
var obj = {name: 'John'}// 密封Object.seal(obj)// 可以修改已有属性的值obj.name = 'Backus'console.log(obj.name) // 'Backus' |
4. Object.isSealed
判断一个对象是否是密封的(sealed)
普通对象是非密封的,和 ES3 保持一致
|
1
2
|
var obj = {}Object.isSealed(obj) // false |
调用 Object.seal 的对象是密封的
|
1
2
3
|
var obj = {}Object.seal(obj)Object.isSealed(obj) // true |
5. Object.freeze
这个方法比 Object.seal 更绝,冻结对象是指那些不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。也就是说,这个对象永远是不可变的。
测试:添加新属性
|
1
2
3
4
|
var obj = {name: 'John'}Object.freeze(obj)obj.age = 30console.log(obj.age) // undefined |
不能添加 age 属性,表明被冻结的对象不能添加新属性。如果是严格模式则报错,如图

测试:修改已有属性
|
1
2
3
4
|
var obj = {name: 'John'}Object.freeze(obj)obj.name = 'Backus'console.log(obj.name) // 'John' |
想修改为 "Backus",输出依然是 "John",表明不能修改已有属性。如果是严格模式则报错,如图

测试:删除已有属性
|
1
2
3
4
|
var obj = {name: 'John'}Object.freeze(obj)delete obj.nameconsole.log(obj.name) // 'John' |
想删除 "name" 属性,输出依然是 "John",表明不能删除已有属性。如果是严格模式则报错,如图

测试:修改已有属性的可枚举性、可配置性、可写性
|
1
2
3
4
5
6
7
|
var obj = {name: 'John'}Object.freeze(obj)Object.defineProperty(obj, 'name', { configurable: true, writable: true, enumerable: true}) |
这个在非严格模式中就报错了,表明 configurable/writable/enmuerable 不能修改,如图

6. Object.isFrozen
判断一个对象是否被冻结(frozen)
普通对象是非冻结的,和 ES3 保持一致
|
1
2
|
var obj = {name: 'John'}Object.isFrozen(obj) // false |
调用 Object.freeze 的对象是冻结的
|
1
2
3
|
var obj = {name: 'John'}Object.freeze(obj)Object.isFrozen(obj) // true |
es6 Object的几个新方法的更多相关文章
- ES6 Object.setPrototypeOf ()方法和defineProperty()方法的使用
将一个指定的对象的原型设置为另一个对象或者null(既对象的[[Prototype]]内部属性). 示例: <script type="text/javascript"> ...
- es6 Object对象扩展新方法
ES6给Object拓展了许多新的方法,如: keys(obj):获取对象的所有key形成的数组 var obj = { foo: 'bar', baz: 42 }; Object.keys ...
- javascript Object的新方法
今天复习es6,又看到Object的一堆方法,与es5的表现又有不一致,耗费了一整天,整理一下: 前几天在司徒正美的书里又看到了es5 Object的字眼,为了向下兼容,大神们也是牛逼的整理出一系列i ...
- 看es6 字符串新方法有感
'x'.repeat(3) // "xxx" 'hello'.repeat(2) // "hellohello" 'na'.repeat(0) // " ...
- firefox-Developer开发者站点——关于Object.create()新方法的介绍
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create Objec ...
- JavaScript ES6 数组新方法 学习随笔
JavaScript ES6 数组新方法 学习随笔 新建数组 var arr = [1, 2, 2, 3, 4] includes 方法 includes 查找数组有无该参数 有返回true var ...
- vue学习(十六) 自定义私有过滤器 ES6字符串新方法 填充字符串
<div id="app"> <p>{{data | formatStr('yyyy-MM-dd')}}</p></div> //s ...
- ES5和ES6中对于继承的实现方法
在ES5继承的实现非常有趣的,由于没有传统面向对象类的概念,Javascript利用原型链的特性来实现继承,这其中有很多的属性指向和需要注意的地方. 原型链的特点和实现已经在之前的一篇整理说过了,就是 ...
- es6 Object.assign
ES6 Object.assign 一.基本用法 Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target).它至少需要两个对象作为参数,第一个参数是目 ...
随机推荐
- .net core Fundamentals
• Application Startup 應用程序啟動 • Middleware 中間件 • Working with Static Files 靜態文件 • Routing 路由 • URL Re ...
- Maven-Optional Dependencies & Dependency Exclusion
本文讨论可选依赖和排除依赖. 帮助用户理解它们是什么, 如何使用, 它们如何工作, 以及什么时候使用它们最合适. 本文也将解释为什么排除是基于单个依赖的, 而非POM级别的. Optional De ...
- 使用Apache Curator监控Zookeeper的Node和Path的状态
1.Zookeeper经常被我们用来做配置管理,配置的管理在分布式应用环境中很常见,例如同一个应用系统需要多台 PC Server 运行,但是它们运行的应用系统的某些配置项是相同的,如果要修改这些相同 ...
- 2016-2017 2 20155335《java程序设计》第四周总结
# 20155335 <Java程序设计>第四周学习总结 ## 教材学习内容总结 继承,在本职上是特殊到一般的关系,即is—a关系,子类继承父类,表明子类是一种特殊的父类,并且具 ...
- 【洛谷 P4934】 礼物 (位运算+DP)
题目链接 位运算+\(DP\)=状压\(DP\)?(雾 \(a\&b>=min(a,b)\)在集合的意义上就是\(a\subseteq b\) 所以对每个数的子集向子集连一条边,然后答案 ...
- hdu 4190 Distributing Ballot Boxes(贪心+二分查找)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4190 Distributing Ballot Boxes Time Limit: 20000/1000 ...
- 【转】png文件格式
前言 我们都知道,在进行J2ME的手机应用程序开发的时候,在图片的使用上,我们可以使用PNG格式的图片(甚至于在有的手机上,我们只可以使用PNG 格式的图片),尽管使用图片可以为我们的应用程序增加不少 ...
- 自动化测试===unittest配套的HTMLTestRunner.py生成html报告源码
更改版: 全部复制,命名为 HTMLTestRunner.py 文件 #使用方法参见之前的文档:自动化测试===unittest和requests接口测试案例,测试快递查询api(二) " ...
- (八)hope
vi svnserve.conf vi passwdvi authz svnserve -d -r /usr/svnkillall svnserveps -ef | grep svnserve svn ...
- 64_k2
kf5-libkdepim-akonadi-17.04.1-1.fc26.x86_64.rpm 25-May-2017 12:22 177198 kf5-libkdepim-devel-17.04.1 ...