前端的數據雙向綁定指的是view(視圖)和model(數據)二者之間的關係;view層是頁面上展現給用戶看的信息,model層通常是指經過http請求從後臺返回的數據。view到model的綁定都是經過事件回調函數操做的,model到view的綁定有多種方法。前端
angular,react,vue等mv*模式的框架都實現了數據雙向綁定;angular是經過髒檢查即新老數據的比較來肯定哪些數據發生了變化,從而將它更新到view中;vue則是經過設置數據的get和set函數來實現的,這種方式在性能上是優於angular的。vue
下面代碼是一個簡單的定義數據get和set方法的例子,set和get方法分別在數據改變和訪問的時候被調用,可以監聽數據的變化:react
1 // 數據綁定的構造函數
2 function Observer(data) {
3 this.data = data; 4 5 for(var key in data) { 6 if(data.hasOwnProperty(key)) { 7 var val = data[key]; 8 if(typeof data[key] === "object"){ 9 // 若是值不爲原始類型,則繼續遞歸 10 new Observer(val); 11 }else { 12 this.convert(key, val); 13 } 14 } 15 } 16 } 17 // 定義set 和 get函數 18 Observer.prototype.convert = function(key, val) { 19 Object.defineProperty(this.data, key, { 20 enumerable: true, 21 confingurable: true, 22 get: function() { 23 console.log(key + "被訪問了"); 24 return val; 25 }, 26 set: function(newVal) { 27 console.log(key + "被設置了新值" + newVal); 28 val = newVal; 29 } 30 }); 31 } 32 var app = new Observer({name: "xieshuai", age: 24, address: {city: "shenzheng"}}); 33 34 app.data.name; // name被訪問了 35 app.data.age = 18; // age被設置了新值18
Object.defineProperty,這是ES5新增的方法,經過這個方法,能夠自定義getter和setter函數。數組
上面的代碼只是個簡單的例子,並無處理數組的狀況;不過這是vue實現數據雙向綁定的核心。app
本文到此結束,文中如有不對之處,還望指正。框架