在火狐,我已經得到了我需要的時候每一個特定的屬性更改爲觸發事件的幾個對象。我使用的是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?
我不認爲我跟着你。我認爲這就是我正在做的。 – Dexter
啊..謝謝。我只是在挖掘方法的getter和setter,並看到我可能能夠向處理程序添加參數。你只是告訴我我在找什麼!謝謝! – Dexter
@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的一些夜晚中可用的。 –