SafariでObject.prototype.watchを使えるようにする
/lang/javascript/watch –
CodeRepos::Share – Trac
にコミットした。
Objectのprototypeを汚染するのが嫌なら、function watch(object, prop, handler)の形に書き直すといいかもしれない。
(function() { if (typeof Object.prototype.watch == "function") return; var watched = {}; Object.prototype.watch = function(prop, handler) { var getter = this.__lookupGetter__(prop), setter = this.__lookupSetter__(prop), oldval = this[prop]; if (!(prop in watched)) { watched[prop] = { setter: setter, getter: getter, }; } this.__defineSetter__(prop, function(newval) { var setter = watched[prop].setter; return oldval = setter? setter(handler(prop, oldval, newval)): handler(prop, oldval, newval); }); this.__defineGetter__(prop, function() { var getter = watched[prop].getter; return getter? getter(): oldval; }); } Object.prototype.unwatch = function(prop, handler) { var setter, getter; if (!(prop in watched)) return; delete this[prop]; if (typeof (setter = watched[prop].setter) != "undefined") { this.__defineSetter__(prop, setter); } if (typeof (getter = watched[prop].getter) != "undefined") { this.__defineGetter__(prop, getter); } } })();