美文网首页
Object.defineProperty

Object.defineProperty

作者: 无故下架内容so账号已弃用 | 来源:发表于2019-09-19 23:44 被阅读0次
    • 作用: 直接在一个对象上定义一个新属性, 或者修改一个对象的现有属性

    • 语法: Object.defineProperty(obj, prop, descriptor)

    • 参数:

      1. obj - 要在其上定义属性的对象,
      1. prop - 要定义或者修改的属性的名称
      1. descriptor - 将被定义或修改的属性描述符, 描述符必须是以下两种形式之一

      a. 数据描述

      configurable 是否可以删除目标属性, 默认为 false
      enumerable 此属性是否可以被枚举, 默认为 false
      value 改属性对应的值, 默认为 undefine
      writable 属性的值是否可以被重写, 默认为 false

      b. 访问器描述

      getter 是一种获得属性值的方法
      setter 是一种设置属性值的方法


    • a. 数据描述

    定义一个 data 对象

    var data = {
      name: 'liguoyou'
    }
    

    修改属性 name

    Object.defineProperty(data, 'name', {
      value: 'guoyou.li'
    })
    
    console.log(data) // {name: "guoyou.li"}
    

    添加属性 birthday

    Object.defineProperty(data, 'birthday', {
      value: '1995-02'
    })
    
    console.log(data) // {name: "guoyou.li", birthday: "1995-02"}
    
    console.log(data.birthday) // 1995-02
    

    尝试重写 data.birthday,
    添加属性 birthday时, writable 默认为false, 无法重写 birthday 的值

    data.birthday = '2019-09'
    
    // writable 默认为false, 无法重写 birthday 的值
    console.log(data.birthday) // 1995-02
    

    添加属性 email, 并设置为可被重写

    Object.defineProperty(data, 'email', {
      value: '516115887@qq.com',
      writable: true
    })
    
    console.log(data) // {name: "guoyou.li", birthday: "1995-02", email: "516115887@qq.com"}
    
    console.log(data.email) // 516115887@qq.com
    

    修改 email 属性值

    data.email = 'guoyou.li@foxmail.com'
    
    console.log(data.email) // guoyou.li@foxmail.com
    

    • b. 访问器描述

    个人信息对象

    var userInfo = {
      id: '56237845',
      name: 'GG'
    }
    

    在对象中添加一个属性与存取描述符的示例

    var telVal = '13588888888'
    Object.defineProperty(userInfo, 'tel', {
      get() {
        return telVal
      },
      set(val) {
        telVal = val
      }
    })
    

    如果我们访问 userInfo 的 tel 属性

    console.log(userInfo.tel) // 13588888888
    

    如果我们设置 userInfo 的属性值

    userInfo.tel = '123543643575'
    

    现在 userInfo.tel 的值总是与 telVal 相同,除非重新定义 userInfo.tel

    console.log(userInfo)
    // 最终的 userInfo 为:
    // {
    // id: "56237845"
    // name: "GG"
    // tel: "123543643575"
    // get tel: ƒ get()
    // set tel: ƒ set(val)
    // __proto__: Object
    // }
    

    更多详细内容查看文档
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

    相关文章

      网友评论

          本文标题:Object.defineProperty

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