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).它至少需要两个对象作为参数,第一个参数是目 ...
随机推荐
- POJ 2823 Sliding Window ST RMQ
Description An array of size n ≤ 106 is given to you. There is a sliding window of size k which is m ...
- Linux系统基本网络配置之ifconfig命令
Linux系统基本网络配置之ifconfig命令 一.Linux系统的网络配置基本包括:网络IP的配置.网关路由的配置.主机DNS的配置.主机名的配置等,本篇注重介绍网络IP的配置. 二.Linux系 ...
- redis cluster以及master-slave在windows下环境搭建
一.redis cluster环境搭建: 1.了解Redis Cluster原理: 详细了解可参考:http://doc.redisfans.com/topic/cluster-tutorial.ht ...
- Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- Problem L. Visual Cube(杭电多校2018年第三场+模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6330 题目: 题意:给你长宽高,让你画出一个正方体. 思路:模拟即可,湘潭邀请赛热身赛原题,不过比那个 ...
- DotNETCore 学习笔记 WebApi
API Description Request body Response body GET /api/todo Get all to-do items None Array of to-do ite ...
- CSS3 动画实现方法大全
常用效果总结(需要引用animate.css) <!doctype html> <html lang="en"> <head> <meta ...
- CSS3禁止网页中文本被选中代码
通常大家会有js来实现,另一个方案就是,将-webkit-user-select 和-moz-user-select 的值设为none,这针对于移动用户,可能会很有用.请谨慎使用这个属性:因为大部分用 ...
- webpack_配置和使用教程
webpack是一个模块打包的工具,它的作用是把互相依赖的模块处理成静态资源. webpack 可以使用 loader 来预处理文件.这允许你打包除 JavaScript 之外的任何静态资源.你可以使 ...
- Android控件——AutoCompleteTextView与MultiAutoCompleteTextView(实现自动匹配输入的内容)
------------------------------------AutoCompleteTextView----------------------