对象属性有两种,一种是数据属性,另一种是访问器属性。
数据属性有四个描述其行为的特性,分别为[[Configurable]]
、[[Enumerable]]
、[[Writable]]
和[[Value]]
。
访问器属性有四个特性,分别为[[Configurable]]
、[[Enumerable]]
、[[Get]]
和[[Set]]
。
想深入了解这两种属性可以前往数据属性和访问器属性。
要修改属性默认的特性,必须使用 Object.defineProperty()
方法。这个方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象。其中,描述符(descriptor)对象的属性必须是数据属性特性或访问器属性特性其中的一或多个值。
一旦把属性的 configurable 设置为 false,就不能再把它变回可配置了。此时,再调用 Object.defineProperty()方法修改除 writable 之外的特性,都会导致错误。
上面这段话是《JavaScript高级程序设计(第3版)》里面的,但是我验证了一下发现有一些偏差。
var obj = {};
Object.defineProperty(obj , "name" , {
value: "XD",
configurable: false
});
Object.defineProperty(obj , "name" , {
value: "XD",
configurable: true
}); //报错
上面这种情况跟红宝书说的情况是一样的,一旦把属性 configurable
设置为 false
,就不能再把它变回可配置了,不然会报错。
var obj = {};
Object.defineProperty(obj , "name" , {
value: "XD",
configurable: false
});
//报错
Object.defineProperty(obj , "name" , {
value: "XD",
configurable: false,
writable: true
});
var obj = {};
Object.defineProperty(obj , "name" , {
value: "XD",
configurable: false,
writable: true
});
//不报错
Object.defineProperty(obj , "name" , {
value: "JH",
configurable: false,
writable: false
});
上面两种情况跟红宝书说的有些不一样。
当 configurable
为 false
,且 writable
为 false
时,调用 Object.defineProperty()
方法修改 writable
为 true
时会报错。
当 configurable
为 false
,且 writable
为 true
时,调用 Object.defineProperty()
方法修改 writable
为 false
时会修改成功,不会报错。