const num = add[1][2][3] + 10 //期望num結(jié)果為16
const num = add[1][5][3] + 20 //期望num結(jié)果為29
問:如何才能輸出num期望結(jié)果呢
這是一個典型的動態(tài)屬性
add[1]明顯add是一個對象
這時候我們就可以使代理來解答了
?const add = new Proxy({? ? ? ?
????????????????????_store:0 // 把這里當成累加?
????????? },{? ? ? ?
????????????????get(target,p,receiver){? //target為代理對象 p為讀取的屬性 //receiver為代理后的對象add? ? ? ?
????????????????????????????????target._store += +p; // 我們只需要累加他的屬性就行了 這里需要轉(zhuǎn)換成數(shù)字 不然就成字符拼接了? ? ? ?
????????????????????????????????return receiver; //為啥要返回add 因為add[1][2][3]他是一個鏈式調(diào)用 相當于還是調(diào)用的add本身? ? ? ?
????????????}?
? })
js代理對象是可以和普通數(shù)字進行相加的 但是他需要轉(zhuǎn)換
如果上面的代碼就這樣運行會報錯 他說不能將一個Symbole轉(zhuǎn)換成一個數(shù)字
Cannot conver a Symbol value to a number at Ojbect.get
這里我們需要注意當add代理對象和數(shù)字進行相加的時候 他會傳進來個符號(Symbol(Symbol.toPrimitive))這個符號叫做知名符號 這個知名符號表示
將一個對象轉(zhuǎn)換成原始類型的時候他就會調(diào)用這個屬性 也就意味著我只要給他這個
符號屬性就行了
const add = new Proxy({? ? ?
????????????? _store:0 // 把這里當成累加?
????????? },{? ? ? ?
????????????????get(target,p,receiver){? //target為代理對象 p為讀取的屬性 //receiver為代理后的對象add? ? ? ?
????????????????????if(p === Symbol.toPrimitive){ // 說明在進行原始類型轉(zhuǎn)換 這個符號要求返回一個函數(shù)? ? ? ? ? ?
????????????????????????????return ()=>{? ? ? ? ? ? ? ?
????????????????????????????????????return target._stroe; 然后我們再返回累加的結(jié)果就行? ? ? ? ? ?
????????????????????????????????}
????????????????????? ? ? ? }? ? ? ?
????????????????????????target._store += +p; // 我們只需要累加他的屬性就行了 這里需要轉(zhuǎn)換成數(shù)字 不然就成字符拼接了? ? ? ?
????????????????????????return receiver; //為啥要返回add 因為add[1][2][3]他是一個鏈式調(diào)用 相當于還是調(diào)用的add本身? ? ? ?
????????????????}
})