引言
我之前經常使用 Vue,後來不滿足於僅僅使用它,我想了解其內部實現原理,所以就嘗試學習其原始碼,獲益匪淺。所以,如果你跟我一樣,希望挑戰這高難度的事情,那就開啟這一系列吧!
基本上 MVVM 資料雙向繫結的框架大都採用了大量的 Object.defineProperty 來實現。
Object.defineProperty 語法
Object.defineProperty(obj, prop, descriptor)
引數:
obj
需要定義屬性的物件。
prop
需定義或修改的屬性的名字。
descriptor
將被定義或修改的屬性的描述符。
返回值
返回傳入函式的物件,即第一個引數obj。
描述
該方法允許精確新增或修改物件的屬性。一般情況下,我們為物件新增屬性是通過賦值來建立並顯示在屬性列舉中(for...in
或 Object.keys
方法), 但這種方式新增的屬性值可以被改變,也可以被刪除
。而使用 Object.defineProperty() 則允許改變這些額外細節的預設設定。例如,預設情況下,使用 Object.defineProperty() 增加的屬性值是不可改變的。
物件裡目前存在的__屬性描述符__有兩種主要形式:資料描述符
和存取描述符
。資料描述符是一個擁有可寫或不可寫值的屬性。存取描述符是由一對 getter-setter 函式功能來描述的屬性。描述符必須是兩種形式之一;不能同時是兩者。
資料描述符和存取描述符均具有以下可選鍵值:
configurable
當且僅當該屬性的 configurable 為 true 時,該屬性描述符才能夠被改變,也能夠被刪除。預設為 false
。
enumerable
當且僅當該屬性的 enumerable 為 true 時,該屬性才能夠出現在物件的列舉屬性中。預設為 false
。
資料描述符同時具有以下可選鍵值:
value
該屬性對應的值。可以是任何有效的 JavaScript 值(數值,物件,函式等)。預設為 undefined
。
writable
當且僅當該屬性的 writable 為 true 時,該屬性才能被賦值運算子改變。預設為 false
。
存取描述符同時具有以下可選鍵值:
get
一個給屬性提供 getter 的方法,如果沒有 getter 則為 undefined。該方法返回值被用作屬性值。預設為 undefined
。
set
一個給屬性提供 setter 的方法,如果沒有 setter 則為 undefined。該方法將接受唯一引數,並將該引數的新值分配給該屬性。預設為 undefined
。