清明假期沒有出去浪,在學校研究Vue的源碼,小弟不才,花了一個下午的時間才整明白在new Vue的時候是怎樣使用 Object.defineProperty
進行數據代理的, 本着輸出就是最好的review的心,寫一篇掘金的處女文!函數
Object.defineProperty(obj, prop, descriptor)
的定義這個方法接受三個參數, 前兩個參數比較好理解, 第一個參數 obj
就是要進行代理或者要進行設置屬性的那個對象, 第二個參數 prop
是要進行設置的對象的屬性
第三個參數 descriptor
略微有點點麻煩,他是一個對象 裏面有一些屬性 和一個 set()
get()
方法 這裏我就直接放我下午折騰的小demo了this
set get
和
value writable
不共存
names
而且這個
names
裏有兩個監聽他 取值和設置值的函數, 只要對
names
這個屬性進行操做就會觸發.
這是Vue源碼的目錄代理
其中 core這個文件夾下的是Vue的核心代碼 咱們能夠在instance
下的
index.js
找到最開始的Vue的那個構造函數,Vue的源頭就是一個構造函數 咱們在
new Vue()
的時候就是在建立一個Vue的實例 並將裏面的配置 好比
el , data, methods什麼的
做爲參數傳入, 以後咱們看到調用了圈出來的
this._init(options)
這個方法定義在當前目錄的
init.js
裏面, 就開始合併傳入的options配置以及初始化生命週期啥的, 直到遇到了今天的重頭戲
state.js
裏 裏面有一個
initState
方法 這裏初始化了Vue實例的各類方法 咱們不關心那麼多 只來着重關心一下
initData
initData
先是將配置項裏的data掛到了當前Vue實例的 _data
屬性上 其實這個纔是Vue真實的屬性 爲何這麼說呢?各位看官一會就會知道 我先在這裏建立了一個簡單的Vue實例 上面所擁有的 data屬性有這些code
這裏主要就是把遍歷全部的data 如何執行咱們今天的重頭戲 也就是 proxy
方法!!cdn
proxy
方法長這樣對象
咱們能夠看到今天的重頭戲只有短短几行 首先 Vue是對 Object.defineProperty
進行了一個封裝 但咱們仍是不難看出 進行操做的對象就是當前的 vm實例, 進行代理的屬性就是每一個傳入的key值, 最後一個對象屬性也能夠很清楚的看到 有 enumerable configurable 和 set() get()
當以前的循壞開始 傳入的值依次是 當前的 vm實例
, '_data'
和'mes'
那麼執行這個函數後 是在vm實例
上直接建立了一個 mes
屬性 當咱們進行get
操做時 return的就是 this['_data']['mes']
真的寫出來就是blog
也不知道我說清楚了沒有..知道的朋友們權當複習 若是看到這裏仍是有不知道的童鞋 我也寫了一個小demo 你們能夠看一下生命週期
最後祝你們節日快樂~ip