js對象中的get和set方法的實現(xiàn)

前言:

對象中有g(shù)et和set方法,在讀取和設定值的時候觸發(fā)。vue中的數(shù)據(jù)綁定就是通過這個來實現(xiàn)的。

1. 直接在對象內(nèi)使用

  • get用法
var user = {
    info: {
        name: "張三"
    },
    get name(){
        return this.info.name;
    }
}
    console.log(user.info.name) // '張三'
    console.log(user.name) // '張三'

作用:
(1). 在對象內(nèi)屬性嵌套層級過多時,可以直接在對象下讀取到對應屬性,簡化調(diào)用;
(2). 在get時可以任意設置屬性名,可以不暴露組件內(nèi)部屬性名。

  • set用法
var user = {
    info: {
        name: "張三"
    },
    set name(val){
        console.log('我改名了');
        this.info.name = val;
    }
}
    console.log(user.name) // '張三'

    user.name = '李四'; // '我改名了'
    console.log(user.name) // '李四'

作用:
(1). 在對象內(nèi)屬性嵌套層級過多時,可以直接在對象下設置到對應屬性,簡化層級;
(2). set方法內(nèi)的邏輯在賦值時會自動執(zhí)行,可以監(jiān)聽屬性值的改變

2. 使用Object.defineProperty()

方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現(xiàn)有屬性,并返回此對象。

Object.defineproperty( object,‘ propName ’ ,descriptor);

參數(shù):

  • object :要定義或修改屬性的對象;

  • propName :要定義或修改的屬性的名稱;

  • descriptor:要定義或修改的屬性描述符。

var user = {
    user_name: '張三'
}

Object.defineProperty(user, 'name', {
    get(){
        return user.user_name
    },
    set(val){
        console.log('我改名了');
        user.user_name = val
    }

})

console.log(user.name) // '張三'
user.name = '王二'; // '我改名了'

console.log(user.name) // '王二'
console.log(user.user_name) // '王二'

作用:
set方法可以監(jiān)聽對應屬性值的改變,vue的數(shù)據(jù)動態(tài)綁定就是通過這個方法實現(xiàn)的,監(jiān)聽到vue實例中的data屬性發(fā)生改變時,在set方法中觸發(fā)模版重新渲染邏輯。

3. 使用Object.defineProperties()

var user = {
    name: '張三'
}

Object.defineProperties(user, {
    nameGet: {
        value: function() {
            console.log('讀取');
            return this.name;
        }
    },
    nameSet: {
        value: function(name) {
            console.log('設置');
            this.name = name;
        }
    }
 

})

console.log(user.nameGet) // '讀取'  '張三'
user.nameSet = '王二'; // '設置'

console.log(user.nameSet) // '王二'

作用:
和方法1直接在對象中設置效果和原理相似

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容