美文网首页
defineProperty笔记

defineProperty笔记

作者: 一个做笔记的地方 | 来源:发表于2019-06-13 23:53 被阅读0次

    【摘自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笔记

          本文链接:https://www.haomeiwen.com/subject/mzkyfctx.html