素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

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);
    }
  }
})();