2011-07-26 67 views
1

火狐,我已經得到了我需要的時候每一個特定的屬性更改爲觸發事件的幾個對象。我使用的是object.watch(),但是當我返回使用「this」更改的屬性的值時,它會在第一次返回舊值,並在第二次和後續時間返回「undefined」:object.watch(),獲得新的價值

var myObject = { 
     "aProperty": 1 
    }; 

function propChanged(prop) { 
    alert(prop); 
} 

myObject.watch("aProperty", function() { 
    propChanged(this.aProperty); 
}); 

myObject.aProperty = 2;//alerts "1" 
myObject.aProperty = 3;//alerts "undefined" 

我不能隨便說警報(myObject.aProperty)的原因是因爲這意味着是一個動態的代碼,將事件處理程序適用於一些,可能不明物體。

我只是不能確定究竟是如何動態獲取使用手錶法屬性的新值。我爲此設置了一個IE原型,所以我並不擔心它不能在那裏工作。我只需要了解「這個」以及它如何適用於手錶方法的所有者。

編輯>>

這裏是新的代碼我使用跨瀏覽器,包括IE瀏覽器等原型:

var myObject = {}; 

if (!Object.prototype.watch) { 
    Object.prototype.watch = 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 
      if (Object.defineProperty) // ECMAScript 5 
       Object.defineProperty(this, prop, { 
        get: getter, 
        set: setter 
       }); 
      else if (Object.prototype.__defineGetter__ && Object.prototype.__defineSetter__) { // legacy 
       Object.prototype.__defineGetter__.call(this, prop, getter); 
       Object.prototype.__defineSetter__.call(this, prop, setter); 
      } 
     } 
    }; 
} 

if (!Object.prototype.unwatch) { 
    Object.prototype.unwatch = function (prop) { 
     var val = this[prop]; 
     delete this[prop]; // remove accessors 
     this[prop] = val; 
    }; 
} 


function propChanged(t, p, o, n) { 
    alert(o); 
} 

Object.defineProperty(myObject, "aProperty", {value: 2, 
    writable: true, 
    enumerable: true, 
    configurable: true}); 

myObject.watch("aProperty", propChanged); 

myObject.aProperty = 3; //alerts 3 
myObject.aProperty = 4; //alerts 4 (n is undefined in propChanged? 

回答

4

您需要返回你想要的屬性從具有價值你傳遞給你的功能。

myObject.watch("aProperty", function (prop, oldval, newval) { 
    propChanged(newVal); 
    return newVal; 
}); 

應該這樣做。

MDN docs一個完整的詳細功能,但相關的位

手錶的賦值給一個名爲道具在這個對象的屬性,調用handler(prop, oldval, newval)每當prop設置和存儲返回值該屬性。觀察點可以過濾(或抵消)的值指派,通過返回改性newval(或通過返回oldval)。

編輯

你編輯的代碼可能會以這種方式工作更好

Object.prototype.watch = function (prop, handler) { 
    var fromPrototype = !Object.hasOwnProperty.call(this, prop), 
    val = this[prop], 
    getter = function() { 
     return fromPrototype ? Object.getPrototypeOf(this)[prop] : val; 
    }, 
    setter = function (newval) { 
     fromPrototype = false; 
     return val = handler.call(this, prop, val, newval); 
    }; 
    if (delete this[prop]) { // can't watch constants 
     if (Object.defineProperty) { // ECMAScript 5 
      Object.defineProperty(this, prop, { 
       get: getter, 
       set: setter, 
       configurable: true, 
       enumerable: true 
      }); 
     } else if (Object.prototype.__defineGetter__ && Object.prototype.__defineSetter__) { // legacy 
      Object.prototype.__defineGetter__.call(this, prop, getter); 
      Object.prototype.__defineSetter__.call(this, prop, setter); 
     } 
    } 
}; 
+0

我不認爲我跟着你。我認爲這就是我正在做的。 – Dexter

+0

啊..謝謝。我只是在挖掘方法的getter和setter,並看到我可能能夠向處理程序添加參數。你只是告訴我我在找什麼!謝謝! – Dexter

+0

@Dexter,不客氣。順便說一句,如果你可以在屬性創建時間掛鉤,通過[defineProperty](https://developer.mozilla)可以跨瀏覽器(對於最新的瀏覽器,包括FF4)完成大部分可以使用'watch'完成的工作。 org/en/JavaScript/Reference/Global_Objects/Object/defineProperty),即使你不能,你也可以通過http://wiki.ecmascript.org/doku.php?id=harmony:proxies攔截方法調用我相信這是在Firefox的一些夜晚中可用的。 –