C、属性特性(用来描述属性的特性)
内部特性 配置属性 属性类型 数据类型 默认值 含义 备注[[Configurable]] configurable
数据属性
访问器属性
Boolean
true
能否通过delete删除属性从而重新定义属性
能否修改属性的特性
能否把属性修改为访问器特性
一旦把属性定义为不可配置的,就不能再变为可配置的
如果为false,不能做删除、也不能修改属性特性,但是允许修改属性值
非严格模式下会忽略相应操作,严格模式下则抛出异常
[[Enumerable]] enumerable
数据属性
访问器属性
Boolean true 能否通过for-in循环返回属性 为true时可以通过for-in来枚举,否则不能通过for-in枚举[[Writable]] writable 数据属性 Boolean true 能否修改属性的值 为false时不能修改属性值,非严格模式下会忽略相应操作,严格模式下则抛出异常
[[Value]] value 数据属性 任意类型 undefined 属性值
[[Get]] get 访问器属性 Undefined/Function undefined 读取属性时调用的函数 为一个函数时,会无参数调用这个函数,并将返回值作为属性值返回
[[Set]] set 访问器属性 Undefined/Function undefined 写入属性时调用的函数 为一个函数时,会将传入的值作为参数调用这个函数,赋给属性
说明:
配置属性是指使用下面要讲的属性定义方法时用以定义相关特性的配置项名称。 对于访问器属性,[[Get]]、[[Set]]不一定都有,没有[[Get]]的属性不能读(返回undefined,严格模式下抛出异常),没有[[Set]]的属性不能写(会忽略,严格模式下抛出异常)。 注意区分对象内部属性和对象属性的特性。D、属性定义方法(用来定义属性的方法)
最常见的定义属性的方法就是直接在对象上添加属性,比如obj.name = 'linjisong',这种情况下定义的属性所具有的内部特性都是默认的,如果想定义一个值不能被修改的属性要怎么做呢?在ES中给我们提供了几个方法用于实现类似的功能。 (1)目标对象 (2)属性的名字 (3)属性描述符对象 使用属性定义方法时
方法名
功能说明
参数和返回值
说明
调用示例
defineProperty()
定义一个属性
[[Enumerable]]
[[Configurable]]
[[Writable]]
默认值为false
// 创建一个包含一个默认属性job的对象(job属性可以修改、删除、在for-in中枚举)
var person = {job:'it'};
// 添加一个不能被修改、删除的name属性
Object.defineProperty(person, 'name', {
value:'linjisong',//这里的配置属性和上面特性列表中的配置属性一致
enumerable:true
});
// 定义多个属性(数据属性year和访问器属性age)
Object.defineProperties(person, {
year:{
value : 2012,
configurable:true,
writable:true
},
age:{
get : function(){
return this.year-1983;
}
}
});
var job = Object.getOwnPropertyDescriptor(person, 'job');
console.info(job.configurable);//true,直接添加属性时默认为true
var name = Object.getOwnPropertyDescriptor(person, 'name');
console.info(name.configurable);//false,使用属性定义方法添加属性时默认为false
console.info(person.name);//linjisong
person.name = 'oulinhai';//由于不能修改,所以值不会改变,在严格模式下会抛出异常
console.info(person.name);//linjisong
person.year = 2015;
console.info(person.year);//2015
console.info(person.age);//32,在修改year的同时,也修改了age属性
defineProperties() 定义一组属性
(1)目标对象
(2)多个属性描述符组成的一个对象
getOwnPropertyDescriptor() 获取属性的特性
(1)目标对象
(2)属性的名字
(3)返回一个包括了属性特性的对象
注:这些方法设置或获取的属性特殊和属性的类型有关,比如数据属性只能设置[[Confirurable]]、[[Enumerable]]、[[Writable]]、[[Value]]。
(2)防篡改对象
所谓防篡改对象,就是给对象一定级别的保护以防止在这个级别上对对象的变更,在ES5规范中,定义了依次升高的三种保护级别: