Vue內部經過Object.defineProperty方法屬性攔截的方式,把data對象裏每一個數據的讀寫轉化成getter/setter,當數據變化時通知視圖更新。html
具體說一下Object.defineProperty:面試
Object.defineProperty() 方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性, 並返回這個對象。bash
Object.defineProperty(obj, prop, descriptor)
obj:要在其上定義屬性的對象。
prop:要定義或修改的屬性的名稱。
descriptor:將被定義或修改的屬性描述符。
複製代碼
Object.defineProperty()具體實現:markdown
let hr={ skill:'', experience:'' } Object.defineProperty(hr, 'skill', { get(){ console.log('必備技能:') return '畫大餅' }, set(newVal){ console.log('加分項:') } }) //讀: console.log(hr.skill) //寫: hr.skill='吹牛皮' 複製代碼
控制檯打印 必備技能: 畫大餅 經驗要求: "吹牛皮" 複製代碼
如今已經能夠檢測到數據的讀和寫,而後就須要通知視圖的更新了.oop
這裏是典型的發佈訂閱模式,在這個模式下:數據是發佈者(Observer),依賴對象是訂閱者(Watcher),他們須要一箇中間人來傳遞,那就是訂閱器(Dep)。post
總結:實現數據的雙向綁定,首先要對數據進行劫持監聽,因此咱們須要設置一個監聽器Observer,用來監聽全部屬性。若是屬性發生變化了,就須要告訴訂閱者Watcher看是否須要更新。由於訂閱者Watcher是有不少個,因此咱們須要有一個消息訂閱器Dep來專門收集這些訂閱者,而後在監聽器Observer和訂閱者Watcher之間進行統一管理。spa
Object.defineProperty() -MDN雙向綁定