疑問
在初學Vue的時候,我發現了一個神奇的事情,在props和data裡的屬性、methods裡面的方法,居然能夠通過this.xx
直接使用。
new Vue({
data:{
words:'hello'
},
created(){
console.log(this.words); //居然可以列印出hello來
}
});
複製程式碼
這特麼是一種武功?在下第一個不服,打算一探究竟。
偷師學藝
熟話說,知己知彼才能百戰不殆,待在下偷看一下Vue的武功祕籍,想好對策,再去上門踢館。然後當上總經理,出任CEO,迎娶白富美,走上人生的巔峰。
Object.defineProperty
是Vue中重要的組成部分,不瞭解的童鞋先檢視一下文件,Object.defineProperty()。
我把這一招稱作隔山打牛大法,果然是奇妙無窮,在下偷學了他的武功心法,為了讓更多的人學會這一招,在下演練一下低配版的隔山打牛。
function proxy (target, source){
for(let key in source){
Object.defineProperty(target,key,{
enumerable: true,
configurable: true,
get:function() {
return source[key];
},
set:function(val) {
source[key] = val;
}
});
}
}
const father = {};
const child = {
money:100
}
proxy(father, child);
father.money // 100
複製程式碼
招式其實很簡單,在呼叫proxy
方法之後,每次去獲取father
的money
的時候,return
的是child
的money
,設定的時候也是這樣的。
擴充
Vue
中的Props、data、methods
都是使用的這一招定義到vm
上的。那麼在元件中,data
必須使用函式和這貨有沒有關係呢?
其實並沒有什麼關係,但是我們可以通過proxy
反推。
在構建元件例項的時候會傳入option
,裡面有一系列的屬性與方法。
Vue.component('my-component',{
template:'<span>{{ message }}</span>' ,
data:{
message:'hello'
}
});
複製程式碼
每次例項化元件的時候,都會使用這個引用地址相同的data
來傳入proxy
中。那麼雖然有多個例項,但實際上隔山打的都是同一個牛。
如果data
是一個函式,那麼就會執行函式,返回一個新的data
物件,這樣隔山打牛就是不同的牛了。
data = vm._data = typeof data === 'function' ? getData(data, vm) : data || {}
複製程式碼
登門踢館
在下也學會了隔山打牛,Vue
你就等死吧。(當上總經理,出任CEO,迎娶白富美,走上人生的巔峰。)
Vue:???
Vue:隔山打牛隻是Object.defineProperty
用法的一種,雖然你知道了可以直接用this.xx
來訪問屬性與方法,但是你知道我是如何做到響應式的嗎?你個辣雞。
Vue:來吧,在下不動,讓你三招。
我:(怎麼辦,不是對手啊,慌的一批)
我:我媳婦昨天出門做頭髮回來了,這次在下就放你一馬。(跑跑跑)
哎,居然不是對手,還是繼續回去修習吧。
我還是去修習那啥,他說的那個啥,Vue
的響應式原力???