2014-01-13 24 views
0

我有一個這樣的對象: var obj = {key1: "hello", key2: {keyA: "1", keyB: "2"}}如何觀看對象的值,它是對象

我目前使用此代碼來觀看時的選擇的關鍵變化的值:

if (!Object.prototype.watch) { 
    Object.defineProperty(Object.prototype, "watch", { 
     enumerable : false, 
     configurable : true, 
     writable : false, 
     value : function(prop, handler) { 
      var oldval = this[prop], newval = oldval, getter = function() { 
       return newval; 
      }, setter = function(val) { 
       oldval = newval; 
       return newval = handler.call(this, prop, oldval, val); 
      }; 

      if (
      delete this[prop]) {// can't watch constants 
       Object.defineProperty(this, prop, { 
        get : getter, 
        set : setter, 
        enumerable : true, 
        configurable : true 
       }); 
      } 
     } 
    }); 
} 

// object.unwatch 
if (!Object.prototype.unwatch) { 
    Object.defineProperty(Object.prototype, "unwatch", { 
     enumerable : false, 
     configurable : true, 
     writable : false, 
     value : function(prop) { 
      var val = this[prop]; 
      delete this[prop]; 
      // remove accessors 
      this[prop] = val; 
     } 
    }); 
} 

obj.watch("key1", function(id, oldval, newval) { 

    console.log(newval) 

}); 
` 

和當「你好」變化時,我可以處理事件。但是,當一個對象的屬性改變(Key2)而沒有用前一個函數對象的所有元素(KeyA和KeyB)時,我怎麼能處理一個事件?

更好說..當一個對象發生變化時可能得到通知而不監視該對象的所有元素?

Thaaanku

回答

1

當一個對象[屬性]變化可能沒有監控該對象的所有元素得到通知?

編號您的watch函數依賴於getters/setters,它們總是屬性特定的。你可以做什麼:

0

正如你可以使觀看到的非兼容的browers工作,看屬性更改可以很容易地將填充工具看在JavaScript中實現。
由於您需要的是與任何現有功能不同,您必須去尋找一個自定義功能,它會查找屬性鏈中的任何更改,具有屬性更改處理程序,如:function handleObjectChange(obj, oldPropValue, newPropValue, propertyPath)其中propertyPath是一個通往屬性的數組(expl1:['KeyA']; expl2:['TimeData','duration'])和oldPropValue/newPropValue是剛更改的屬性的舊/新值。
propertyPath當對象本身發生變化時爲空/未定義,在這種情況下,old/new PropertyValue包含該對象的舊/新值。

很明顯,這只是實現您所尋求的一種方法,但基本點是:因爲它是一個特定的需求,所以要構建您自己的具體答案。