defineProperty笔记

【摘自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 属性的原因吧。

你可能感兴趣的:(defineProperty笔记)