在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后续会介绍)
这里需要注意,当configurable和writable为false的情况下,试图删除或更改相对应的属性,常规模式下操作将会被忽略,如果是严格模式,将会抛出异常。我们的代码会加上"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