Re: JavaScriptでJava風にsuperクラスにアクセスするライブラリ作った :右京web

追記:prototypeチェーンにsuperが2つ絡むとループすることに気がついた・・・のだけど、解決法がわからん。superは一回だけでお願いします(これはひどい)。

解決させようと考えてみた。

arguments.callee.callerというアレな手を使う。this.super()と親のコンストラクタを呼ぶ時は自身がコンストラクタの場合であろうという前提。
呼び出し元関数がコンストラクタである必要があるので、functio A(){ this.init.apply(this, arguments); }みたいなことをして、initメソッド内でthis.super()はできない(この場合、this.super.constructor.apply(this, arguments);いけそうだけど)

Object.defineProperty(Object.prototype, 'super', {
  get: function() {
    var superProto,
        proto,
        method,
        constructor,
        self = this;

    proto = Object.getPrototypeOf(self);
    superProto = Object.getPrototypeOf(proto);
    method = function (_, name) {
      if (name === "super")
        return proto ? proto.super : null;

      if (superProto === null)
        throw TypeError("[[Prototype]] is null");

      var value = superProto[name];
      if (typeof value === "function")
        return value.bind(self);

      return value;
    };
    constructor = function () {
      var caller = arguments.callee.caller,
          callerSuperProto = Object.getPrototypeOf(caller.prototype);
      if (callerSuperProto)
        callerSuperProto.constructor.apply(this, arguments);
    }.bind(self);

    return Proxy.createFunction({ get: method }, constructor);
  },
});