2010年03月16日 02:00 [Edit]

javascript - 万能継承関数

たとえば、

(function(o){
    o.jump = function() {
        alert("Jumps, jump, jumpoo!!");
    };
    o.sayOwnFavorite = function() {
        alert("I like "+this.favorite+"!");
    };
})(Child.prototype);

と書けば、apply()が不要になる。それでも元発言のthisや上記のo相当が冗長。

というわけで、万能継承関数を作ってみた。

newChild = function(mom, prop, proto){
  var kid = function(o){
    for (var p in prop) this[p] = prop[p];
    for (var p in o) this[p] = o[p];
  };
  kid.prototype = new mom;  
  for (var p in proto) kid.prototype[p] = proto[p];
  return kid;
};

Parent = newChild(
  Object, /* 親がない場合もこれを指定すればおk. Functionでもよい */
  {name:"parent"}, 
  {
    sayHello:function(){
      alert("Hello! I'm "+this.name+"!");
    }
  }
);

Child = newChild(
  Parent,
  { name:"child",favorite:"popsicle" },
  {
    jump:function() {
      alert("Jumps, jump, jumpoo!!");
    },
    sayOwnFavorite:function() {
      alert("I like "+this.favorite+"!");
    }
  }
);

(new Child).sayHello();
(new Child({favorite:"javascript"})).sayOwnFavorite();

Enjoy!

Dan the JavaScripter


この記事へのトラックバックURL

この記事へのトラックバック
ちょっと検索したらダンコーガイの記事を見つけた。 このコードだと new Type(ほげほげ) のほげほげの部分のパラメータが、作られるオブジェクトのメンバーになると決まってしまっている(for (var p in o) this[p] = o[p];の部分)。 これをもうちょっと変えればコンストラク
[その他]Javascript でクラス指向に継承してコンストラクタも使う【public: typedef Takel::Diary Observable;】at 2010年12月06日 17:47
この記事へのコメント
かなり今更ですが、
万能継承関数を用意する手間が唯一のデメリットですね。

それでもメリットの方が大きく感じます。
元ネタの方は定義に3つの文を書いているのに対し、万能継承関数は一つの文で定義出来ている。
万能継承関数のとる引数を見ればその文が何をやっているのかが解ることも魅力ですかね。
Posted by https://me.yahoo.co.jp/a/YUoEIFFfMYAUIusmsAmeF349xwINfKQOMaFm#04b17 at 2011年03月15日 18:27
元ネタの良さは、thisの指すモノが一貫しているように見える(実際は違いますが)、事前に関数を定義しておくような手間が必要ない、といったところだと思います。
Posted by http://www.hatena.ne.jp/os0x/ at 2010年03月16日 03:16