先實現一個簡單的數據劫持。
思路:編程
遍歷對象的每一個屬性,爲每一個屬性掛上監聽函數(即利用Object.defineProperty進行元編程);app
考慮屬性的子屬性的監聽;
先上代碼:函數
function Observer(data) { this.data = data; this.walk(data); } Observer.prototype.walk = function(obj) { var val; for (var key in obj) { if (obj.hasOwnProperty(key)) { val = obj[key]; if (obj[key] instanceof Object) { new Observer(obj[key]); } this.convert(key, val); } } } Observer.prototype.convert = function(key, val) { Object.defineProperty(this.data, key, { enumerable: true, configurable: true, get: function() { console.log('你訪問了' + key); return val; }, set: function(newVal) { console.log('你設置了' + key); console.log('新的' + key + '=' + newVal); if (val === newVal) { return; } val = newVal; } }); } var data = { user: { name: "lixixi", age: "24" }, address: { city: "beijing" } }; var app = new Observer(data);
其中涉及的知識點:this
Object.defineProperty(object, key, {});prototype
若是屬性值仍是對象,則遞歸繼續new Observer;code