vue資料雙向繫結的原理和vue-router路由的實現原理
vue實現雙向資料繫結的原理就是利用了 Object.defineProperty() 這個方法重新定義了物件獲取屬性值(get)和設定屬性值(set)的操作來實現的。
在MDN上對該方法的說明是:Object.defineProperty() 方法會直接在一個物件上定義一個新屬性,或者修改一個物件的現有屬性, 並返回這個物件。
它接收三個引數,要操作的物件,要定義或修改的物件屬性名,屬性描述符。重點就是最後的屬性描述符。
屬性描述符是一個物件,主要有兩種形式:資料描述符和存取描述符。這兩種物件只能選擇一種使用,不能混合兩種描述符的屬性同時使用。上面說的get和set就是屬於存取描述符物件的屬性。
然後我們可以通過在存取描述符中的get和set方法內寫入自定義的邏輯來實現物件獲取屬性和設定屬性時的行為。
var keyValue = 1; var obj = {}; Object.defineProperty(obj,'key', { enumerable: true, configurable: true, get: function(){ return keyValue; }, set: function(newValue){ keyValue = newValue; console.log(`keyValue的值已發生改變,目前的值是:${keyValue}`); } }); obj.key; // 1 obj.key = 'obj物件的key屬性已經綁定了變數keyValue的值'; // keyValue的值已發生改變,目前的值是:obj物件的key屬性已經綁定了變數keyValue的值 // "obj物件的key屬性已經綁定了變數keyValue的值" keyValue; // "obj物件的key屬性已經綁定了變數keyValue的值"
上面這個例子就是改變了物件獲取屬性及設定屬性的預設行為。
物件obj獲取屬性key的值時,會觸發上面的get方法,得到的是變數keyValue的值,然後當重新設定key的值時,觸發set方法,會將變數keyValue的值改變為設定的值,如此就實現了一個簡單的雙向繫結:改變keyValue,obj.key得到的值也會改變,重新設定obj.key,keyValue一樣會隨之改變。
當然,vue的雙向繫結實際更復雜,但最基本的原理就是基於Object.defineProperty()方法改變資料存取的預設行為來實現的。