ES5规范之Object增强

本文详细介绍了ES5中Object对象的增强功能,包括defineProperty、defineProperties、getOwnPropertyDescriptor、create、getPrototypeOf、keys、getOwnPropertyNames、preventExtensions、isExtensible、seal、isSealed、freeze和isFrozen等方法的使用,强调了这些函数在编写安全健壮的程序中的重要性,并通过示例展示了如何使用这些方法来控制对象的属性行为和安全性。
摘要由CSDN通过智能技术生成

在ES5规范中,还有一个比较重要的改进,就是Object对象的增强,ES5为Object新增了一系列函数,用于编写安全健壮的程序,今天我们就来一一介绍它们的使用方法。

下面就是ES5中Object新增的函数:

Object.defineProperty(object, propertyName, descriptor);

Object.defineProperties(object, descriptors);

Object.getOwnPropertyDescriptor(object, propertyName);

Object.create(prototype, descriptors);

Object.getPrototypeOf(object);

Object.keys(object);

Object.getOwnPropertyNames(object);

Object.preventExtensions(object);

Object.isExtensible(object);

Object.seal(object);

Object.isSealed(object);

Object.freeze(object);

Object.isFrozen(object);


下面我们逐一介绍:


Object.defineProperty(object, propertyName, descriptor);

defineProperty函数用于定义一个对象上的属性以及这个属性的描述符。这里涉及到描述符这个概念,需要先理解一下,描述符是用来描述一个属性的值和这个属性在运行期的访问控制,一个描述符包含下面几个声明:

configurable: 表示是否能通过delete删除对象中的该属性,以及是否能重新定义该属性,默认是false,默认情况下,不能用delete删除属性,不能重新定义该属性。需要注意的是,一旦明确设置configurable为false之后,就再也不能重新设置这个规则为true了。

enumerable: 表示能否通过for-in循环获得对象中的该属性,默认值是false,默认情况下,使用for-in循环将不能看到该属性出现。

writable: 表示能否修改该属性,默认值是false,默认情况下,不能再更改该属性的值。

value: 该属性的值,默认值是undefined。通常我们会设置value为一个有意义的值。

下面是每个声明的默认值列表:(Get和Set后续会介绍)


这里需要注意,当configurablewritablefalse的情况下,试图删除更改相对应的属性,常规模式下操作将会被忽略,如果是严格模式,将会抛出异常。我们的代码会加上"use strict";来启用严格模式。关于严格模式的细节,我们后续的文章会专门介绍。

我们先来使用defineProperty函数定义一个对象的属性:

"use strict";

var person = {};

Object.defineProperty(person, 'name', {
  value: 'Scott'
});

person.name = 'John';

上面的代码我们使用defineProperty为person对象定义了一个name属性,然后试图更改它的值。如果在常规模式下运行,更改操作将会被忽略,这里我们加上了严格模式的声明,将会抛出下面的异常:

如果通过delete试图删除name属性,同样也会得到一个异常结果:

delete person.name;

我们稍微改动一下代码,为defineProperty函数的最后一个参数添加一个writable声明:

"use strict";

var person = {};

Object.defineProperty(person, 'name', {
  writable: true, //add writable as true
  value: 'Scott'
});

person.name = 'John';
console.log('after changing the name: ', person.name);

delete person.name;
con
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值