【摘自MDN】
对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。存取描述符是由getter-setter函数对描述的属性。描述符必须是这两种形式之一;不能同时是两者。
【摘自红本书】
ECMAScript 中有两种属性:数据属性和访问器属性。描述符必须是这两种形式之一。
数据属性 / 数据描述符
数据属性包含一个数据值的位置。在这个位置可以读取和写入值。
直接定义一个对象的属性,这些属性的默认值为 true;如果通过描述符定义,默认值均为false。
-
configurable
:能否通过 delete 删除属性,能否修改属性的描述符。 -
enumerable
:表示能否通过 for-in 循环返回属性。 -
writable
:表示能否修改属性的值。 -
value
:值。
let person = {
age: 18
}
Object.defineProperty(person, 'name', {
value: "Yumi",
})
// 直接在对象中定义的,configurable默认为true
console.log(delete person.age) // true ()
// 在描述符中定义的,configurable默认为false
console.log(delete person.name) // false (删除失败)
configurable 为 false 后,描述符不可再修改。
即一旦把属性定义为不可配置的, 就不能再把它变回可配置了。
var person = {};
Object.defineProperty(person, "name", {
configurable: false,
value: "Yumi"
});
//抛出错误
Object.defineProperty(person, "name", {
configurable: true,
value: "SB"
});
访问器属性 / 存取描述符
直接定义一个对象的属性,这些属性的默认值为 true;如果通过描述符定义,默认值均为false。
-
configurable
:能否通过 delete 删除属性,能否修改属性的特性,或者能否把属性修改为访问器属性。 -
enumerable
:表示能否通过 for-in 循环返回属性。 -
get
:在读取属性时调用的函数。 -
set
:在写入属性时调用的函数。
不一定非要同时指定 get 和 set。
只指定 get 意味着属性是不能写,尝试写入属性会被忽略。其实这就是访问器属性没有 writbale 属性的原因吧。
网友评论