2023-02-13

作者: Cissy_fba3 | 来源:发表于2023-02-12 16:50 被阅读0次

Object.defineProperty()在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

句法

Object.defineProperty(obj, prop, descriptor)
obj:目标对象
prop:要操作对象的属性
descriptor:属性的配置信息对象。

descriptor

descriptor是一个对象,有以下配置项。
value:该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)
writable:当且仅当该属性的 writable 键值为 true时,属性的值,也就是上面的value,才能被赋值运算符改变。默认为 false
enumerable:当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。默认为 false
configurable:当且仅当该属性的 configurable 键值为 true 时,该属性的descriptor才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false

let rose = {age: 18}
Object.defineProperty(rose, 'gender', {
    value: 'female',
    // writable:false,
    // enumerable:false,
    // configurable:false
})
rose.gender='male'
console.log(rose)//gender依旧为female,因为writable默认为false
console.log(Object.keys(rose))//只有age一个项,因为enumerable默认为false
console.log(delete rose.gender) //false 删除失败,configurable默认为false
Object.defineProperty(rose, 'gender', {
    value: 'male',
    writable:true
})// Uncaught TypeError: Cannot redefine property: gender at Function.defineProperty  configurable默认为false,配置项不能修改,在第一次定义为true时就可以修改

get 用来读取属性值的函数
set用来设置属性值的函数
!!注意:【value/writable】和【get/set】不能同时存在。

const o = {}
let bValue = 38;
Object.defineProperty(o, "b", {
  get() {
    return bValue;
  },
  set(newValue) {
    bValue = newValue;
  },
  enumerable: true,
  configurable: true,
});

get和set可以用来做响应式数据的监测,Vue2的响应式就是基于此实现的。

let data = {
    name: 'zyl',
    hobby: ['diving', 'basketball'],
    age: 18
}

function Observer(obj) {
    let keys = Object.keys(obj)
    keys.forEach((key) => {
        Object.defineProperty(this, key, {
            get() {
                return obj[key]
            },
            set(val) {
                console.log(`${key}属性改变了,执行更新模板操作`)
                obj[key] = val
            }
        })
    })
}

let vm = {}
vm._data= data = new Observer(data)
data.age = 20
// console.log(vm._data)

function set(obj, key, val) {
    let _val = val
    Object.defineProperty(obj, key, {
        get() {
            return _val
        },
        set(value) {
            _val = value
        }
    })
}
set(vm._data, 'favoriteColor', 'green')

相关文章

  • 读书收获:商定咨询方案

    中原焦点团队 坚持分享1670天 2023-02-13 今天,跟着刘老师的训练营读书到“商定咨询方案”。 商定...

  • 2023-02-13运动饮食打卡

    2023-02-13运动饮食打卡 全天总摄入量 1725千卡。 全天总消耗量 1600+1106=2706 总摄入...

  • 2023-02-13

    打卡44天 《学会写作》 写作过程是先有内核,向外发散,有了框架,形成文字,做排版呈现。读者感受的过程,顺序是相反...

  • 2023-02-13

    打卡44天 《学会写作》 写作过程是先有内核,向外发散,有了框架,形成文字,做排版呈现。读者感受的过程,顺序是相反...

  • 2023-02-13

    小学教师励志简短寄语1 1、昨天,已经是历史;明天,还是个未知数;把昨天和明天连接在一起的是今天。愿你紧紧地把今天...

  • 2023-02-13

    读书时的一些杂念:我今天要把这本书读完,读了多少页了?还有多少页才能读完?怎么还没读完?快翻页,我要像爽文一样读,...

  • 2023-02-13

    【创新脑图临摹大赛第八季-许心有礼特约】第6篇“错误判断与犹豫不决” 1、身处社会之中,不管是做产品 、还是交朋友...

  • 2023-02-13

    因为是一个人,所以很快。很享受这种一个人,也在尽量创造一个人的机会。比如一个人去坐地铁,随心所欲的选择路线,或者随...

  • 2023-02-13

    没啥可说的,就祝自己生日快乐吧

  • 2023-02-13

    2.教师的双成长, “我的微笑是最美的”,三个目标,首先是我,做事之前 先是我的角色定位。微笑,自信阳光,微笑呈现...

网友评论

    本文标题:2023-02-13

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