不知道你在使用Vue的時候有沒有想過,爲何定義在data
對象中的屬性,能夠用Vue
的實例this
進行訪問?bash
咱們來看看源碼的實現。markdown
var sharedPropertyDefinition = { enumerable: true, configurable: true, get: noop, set: noop }; // 源碼中是這樣調用的:proxy(vm, '_data', key) // vm是Vue的實例,key是data對象屬性的名字 function proxy (target, sourceKey, key) { sharedPropertyDefinition.get = function proxyGetter () { return this[sourceKey][key] }; sharedPropertyDefinition.set = function proxySetter (val) { this[sourceKey][key] = val; }; Object.defineProperty(target, key, sharedPropertyDefinition); } 複製代碼
好比有個以下demoapp
const vm = new Vue({ el: '#app', data: { message: 'Hello Vue!' }, created() { console.log(this.message) // 輸出Hello Vue! console.log(this._data.message) // 一樣輸出Hello Vue! } }) 複製代碼
也就是說當咱們這樣this.message
寫的時候,Vue
經過Object.defineProperty
給this.message
設置一層代理,實際訪問的是this._data
裏的message
屬性,而this._data
指向的對象就是咱們寫的data
對象。oop