defineProperty笔记

2019-06-13  本文已影响0人  一个做笔记的地方

【摘自MDN】
对象里目前存在的属性描述符有两种主要形式:数据描述符存取描述符。数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。存取描述符是由getter-setter函数对描述的属性。描述符必须是这两种形式之一;不能同时是两者。

【摘自红本书】
ECMAScript 中有两种属性:数据属性访问器属性。描述符必须是这两种形式之一。

数据属性 / 数据描述符

数据属性包含一个数据值的位置。在这个位置可以读取和写入值。
直接定义一个对象的属性,这些属性的默认值为 true;如果通过描述符定义,默认值均为false。

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。

不一定非要同时指定 get 和 set。
只指定 get 意味着属性是不能写,尝试写入属性会被忽略。其实这就是访问器属性没有 writbale 属性的原因吧。

上一篇下一篇

猜你喜欢

热点阅读