美文网首页js css html
对象中的getter/setter和Object.defineP

对象中的getter/setter和Object.defineP

作者: kevision | 来源:发表于2022-07-25 13:37 被阅读0次

    对象中的get和set方法


    每一个JS对象除了自身的属性,还有setter和getter的内部属性,当读取对象属性的值时,访问的其实是getter,设置对象属性值时,访问的是setter。

    let obj = {
      name: 1,
      get age() {
        return 22
      },
      set age(value) {
        obj.name = value
      }
    }
    obj.age = 300
    console.log(obj.age) // 22
    console.log(obj.name) // 300
    

    obj中的name是数据属性
    get、set后的age属性是访问器属性。访问器属性:当外部js给age赋值时走的是setter函数,当外部js获取age时, 走的是getter函数,setter和getter是隐藏函数,会取我们写在age后边的函数。

    Object.defineProperty()语法


    Object.defineProperty(obj, prop, descriptor)

    参数

    • obj
      要在其上定义属性的对象。
    • prop
      要定义或修改的属性的名称。
    • descriptor
      将被定义或修改的属性描述符。

    返回值

    被传递给函数的对象。

    属性描述符

    Object.defineProperty() 为对象定义属性,分 数据描述符存取描述符 ,两种形式不能混用。

    value:被定义的属性的值,默认为undefined;
    writable: 是否可以被重写(被重新赋值),true可以重写,false不能重写,默认为false;
    enumerable:是否可以被枚举(使用for...in或者Object.keys()),设置为true可以被枚举,设置为false,不能被枚举,默认为false;
    configurable: 是否可以删除目标属性或者是否可以再次修改属性的特性(writable,configurable,enumerable),设置为true可以被删除或者重新设置特性,设置为false,不能被删除或者不可以设置新的特性,默认false。
    get: 一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。默认为 undefined。
    set: 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。默认为 undefined。

    数据描述符和存取描述符

    数据描述符和存取描述符均具有configurableenumerable可选键值,另外数据描述符具有valuewritable可选键值,存取描述符具有getset可选键值。

    const obj = {}
    Object.defineProperty(obj, 'a', {
        value: 'first', // 给obj的a属性赋值为first
        writable: true, // 如果不设置这个属性,obj.a将不能修改值
        configrable: false, // 如果为true,则可以删除或者更改这个属性
        enumerable: true // 该出现是否可以出现在for in和Object.keys中进行遍历
    })
    obj.a = 'second'
    console.log(obj.a)  // 输出second
    

    存取器getter/setter

    getter: 当访问该属性时,该方法会被执行,函数的返回值会作为该属性的值返回;
    setter: 当属性值修改时,该方法会被执行,该方法将接受唯一的参数,即该属性的新参数值;
    不要在getter中再次获取该属性值,也不要在setter中再次设置该属性,会发生无限递归,会栈溢出。

    const obj = { b: 0 }
    Object.defineProperty(obj, 'a', {
        get() {
            return tmp
        },
        set(val) {
            tmp = val
            this.b++
        }
    })
    obj.a = 'second'
    console.log(obj.a)    // 输出second
    obj.a = 'third'
    console.log(obj.a)    // 输出third
    obj.a = 'fourth'
    console.log(obj.a)    // 输出fourth
    obj.a = 'fifth'
    console.log(obj.a)    // 输出fifth
    console.log(obj.b)    // 输出4
    

    参考文章:
    https://zjz666.com/js/550.html
    https://blog.csdn.net/weixin_44976833/article/details/104526881
    https://juejin.cn/post/6844903903822086151

    相关文章

      网友评论

        本文标题:对象中的getter/setter和Object.defineP

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