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).它至少需要两个对象作为参数,第一个参数是目 ...
随机推荐
- 51Nod 最大子矩阵和 | DP
Input 第1行:M和N,中间用空格隔开(2 <= M,N <= 500). 第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开.(-10^9 <= M[i] < ...
- 51Nod 1001数组中和等于K的数对
Input示例 8 9 -1 6 5 3 4 2 9 0 8 Output示例 -1 9 0 8 2 6 3 5 first try: #include "bits/stdc++.h&quo ...
- iOS 隐藏/显示导航栏
一.隐藏导航栏 [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBa ...
- 招人不是HR第一职责,留住人才是
什么是HR的第一责任?我希望你们知道,招人不是你的第一职责,留住人才是你的第一职责.HR工作是相当难做的,你们是公司集团内里各个部门中最难做的部门,也是最具战略性的部门. 以人为本,这个“人”就是阿里 ...
- quick-cocos2dx 悬浮节点(NotificationNode)
cocos2dx 开发游戏时,有时某些节点不需要随着场景的切换而销毁.但cocos2dx的机制只允许同时只有一个运行的场景,如果你的所有节点都是依附于这个场景的,那场景的切换必然带来节点的销毁. 比如 ...
- 大聊Python----进程和线程
什么是线程? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. ...
- perl6中字符串字母编历
use v6; my $input = prompt '输入字符串:'; for $input.words -> $word { say $word; } for $input.comb -&g ...
- Msfvenom学习总结-MSF反弹webshell
1. –p (- -payload-options) 添加载荷payload. 载荷这个东西比较多,这个软件就是根据对应的载荷payload生成对应平台下的后门,所以只有选对payload,再填 ...
- vue-router 基础
安装 NPM npm install vue-router 如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能: import Vue from 'vue' import ...
- 在ubuntu上配置LAMP架构
1. 安装MySQL /* ubuntu默认进入系统是普通用户 所以在真实工作中,我们会得到root的授权. 所以我们需要用sudo做一切只有root才能完成的操作. */ [root@LAMP ~] ...