es6 Object的几个新方法

  1. 扩展对象
    1. Object.preventExtensions
    2. Object.isExtensible
  2. 密封对象
    1. Object.seal
    2. Object.isSealed
  3. 冻结对象
    1. Object.freeze
    2. Object.isFrozen

1. Object.preventExtensions

阻止对象扩展,让一个对象变的不可扩展,也就是永远不能再添加新的属性

ES3 是没有办法阻止对象扩展的,定义对象后可以给对象添加任意属性,如

var obj = {name: 'John'}
 
// 又添加一个属性 age
obj.age = 30
 
// 又添加一个方法
obj.setAge = function(a) {
    this.age = a
}

ES5 的 Object.preventExtensions 则可以阻止给对象添加新属性

var obj = {name: 'John'}
 
// 阻止对象扩展
Object.preventExtensions(obj)
 
// 添加新属性
obj.age = 30
 
// 测试新属性,是 undefined,表明未添加成功
console.log(obj.age)

如果严格模式,则会报错

'use strict'
var obj = {name: 'John'}
Object.preventExtensions(obj)
obj.age = 30

如图

2. Object.isExtensible

判断一个对象是否可扩展,即是否可以给它添加新属性

默认普通对象都是可以扩展的,这和 ES3 保持一致

var obj = {}
 
// true,表示可扩展
Object.isExtensible(obj)

但调用 ES5 的 Object.preventExtensions 后就返回 false 了

var obj = {}
Object.preventExtensions(obj)
 
// false,表示不可添加新属性
Object.isExtensible(obj)

3. Object.seal

让一个对象密封,并返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可以修改已有属性的值的对象。

测试:添加新属性

var obj = {name: 'John'}
 
// 密封
Object.seal(obj)
 
// 不能添加新属性
obj.age = 30
console.log(obj.age) // undefined

测试:删除已有属性

var obj = {name: 'John'}
 
// 密封
Object.seal(obj)
 
// 不能删除已有属性
delete obj.name // false
console.log(obj.name) // 'John',依然存在

测试:修改已有属性的可枚举性、可配置性、可写性

var obj = {name: 'John'}
 
// 密封
Object.seal(obj)
 
// 修改已有的配置属性
Object.defineProperty(obj, 'name', {
    configurable: true,
    writable: true,
    enumerable: true
})

浏览器提示报错

测试:修改已有属性的值

var obj = {name: 'John'}
 
// 密封
Object.seal(obj)
 
// 可以修改已有属性的值
obj.name = 'Backus'
console.log(obj.name) // 'Backus'

4. Object.isSealed

判断一个对象是否是密封的(sealed)

普通对象是非密封的,和 ES3 保持一致

var obj = {}
Object.isSealed(obj) // false

调用 Object.seal 的对象是密封的

var obj = {}
Object.seal(obj)
Object.isSealed(obj) // true

5. Object.freeze

这个方法比 Object.seal 更绝,冻结对象是指那些不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。也就是说,这个对象永远是不可变的。

测试:添加新属性

var obj = {name: 'John'}
Object.freeze(obj)
obj.age = 30
console.log(obj.age) // undefined

不能添加 age 属性,表明被冻结的对象不能添加新属性。如果是严格模式则报错,如图

测试:修改已有属性

var obj = {name: 'John'}
Object.freeze(obj)
obj.name = 'Backus'
console.log(obj.name) // 'John'

想修改为 "Backus",输出依然是 "John",表明不能修改已有属性。如果是严格模式则报错,如图

测试:删除已有属性

var obj = {name: 'John'}
Object.freeze(obj)
delete obj.name
console.log(obj.name) // 'John'

想删除 "name" 属性,输出依然是 "John",表明不能删除已有属性。如果是严格模式则报错,如图

测试:修改已有属性的可枚举性、可配置性、可写性

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 保持一致

var obj = {name: 'John'}
Object.isFrozen(obj) // false

调用 Object.freeze 的对象是冻结的

var obj = {name: 'John'}
Object.freeze(obj)
Object.isFrozen(obj) // true

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏zaking's

用js来实现那些数据结构09(集合01-集合的实现)

  说到集合,第一个想到的就是中学学到的那个数学概念:集合。在我们开始集合相关的js实现前,我们有必要来了解一下什么是集合以及集合的数学概念。   好吧,我们一...

380100
来自专栏微信公众号:Java团长

Java集合框架综述

最近打算复习复习JDK中的集合框架,并尝试分析其源码,这么做一方面是这些类非常实用,掌握其实现能更好的优化我们的程序;另一方面是学习借鉴JDK是如何实现了这么一...

10630
来自专栏Deep learning进阶路

C++随记(二)---动态分配内存问题(1)

C++随记(二)---动态分配内存问题(1) 面向对象的编程的一个特点就是在运行阶段(而不是编译阶段)进行决策。运行阶段决策提供了灵活性,可以根据当时的情况进行...

20600
来自专栏owent

再议 C++ 11 Lambda表达式

C++ 11 标准发布,各大编译器都开始支持里面的各种新特性,其中一项比较有意思的就是lambda表达式。

11420
来自专栏java达人

Java 8 Stream 教程 (三)

作者:Benjamin 译者:java达人 来源:http://winterbe.com/posts/2014/07/31/java8-stream-tuto...

25460
来自专栏Modeng的专栏

Javascript数组系列一之栈与队列

所谓数组(英语:Array),是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。 组成数组的各个变量称为数组的分量,也称为数组的元素...

15750
来自专栏程序员互动联盟

【编程基础】聊聊C语言-第一只螃蟹

上一篇我们介绍了开发C语言需要了解的基础术语和开发C语言常用的工具做好了进行C语言编程的准备,现在我们开始操刀烹炸C语言编程世界的第一道菜-hello wor...

372130
来自专栏程序员互动联盟

【专业技术】C++里面重要的几个关键字的用法

编者按: 这几个关键字非常重要,程序中经常见到他们的身影,但是确切意思有时候还需要多搜索下才能知道。笔者这里把它搬出来,也是希望大家引起重视,努力掌握它。 C+...

37470
来自专栏小樱的经验随笔

数据结构学习笔记【持续更新】

数据结构概述:   定义:     我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到保存到主存储器(内存)中,     以及在此基础上为实...

23630
来自专栏拭心的安卓进阶之路

Java 集合深入理解(3):Collection

今天心情有点粉,来学学 Collection 吧! 什么是集合? 集合,或者叫容器,是一个包含多个元素的对象; 集合可以对数据进行存储,检索,操作; 它们可以...

26350

扫码关注云+社区

领取腾讯云代金券