prototype.jsはプロトタイプと言う割りにプロトタイプチェーンがつながらない。
プロトタイプ型オブジェクト指向とは
プロトタイプ型オブジェクト指向とはプロトタイプ理論に基づいたオブジェクト指向である。
プロトタイプ型オブジェクト指向ではプロトタイプチェーンが重要である。
(以下略w)
prototype.jsによる継承
以下に Human クラスと Singer クラスを作ってみる。プロトタイプチェーンはつながるかなぁ?
// Human クラス var Human = Class.create(); Human.prototype = { name: '', initialize: function(name) { this.name = name; } }; // Singer クラス var Singer = Class.create(); Object.extend(Singer.prototype, Human.prototype); Object.extend(Singer.prototype, { song: '', initialize: function(name, song) { Human.prototype.initialize.call(this, name); this.song = song; }, sing: function() { alert(this.song); } });
このあと Human の定義を変えたとしよう
Human.prototype.sayName = function() { alert(this.name); };
このとき、プロトタイプチェーンが繋がっていれば Singer でも sayName が動くはずである。
しかし、結果は NO。
たしかに、 new Human() としてつなげることは出来る。おっしゃるとおり。
しかし、コンストラクタの引数はどうなるのか?他人が書いたクラスのプロトタイプを作るための適切な引数を導き出せるのか。
ちなみに jsolait
jsolait だとちゃんとプロトタイプをつなげることが出来る。
// Human クラス var Human = Class('Human', function(publ, priv) { publ.name = ''; publ.__init__ = function(name){ this.name = name; }; }); Human.__createProto__ = function() {return new Human('')} // Singer クラス var Singer = Class('Singer', Human, function(publ, priv, supr) { publ.song = ''; publ.__init__ = function(name, song){ supr.__init__.call(this, name); this.song = song; }; }); Singer.__createProto__ = function() {return new Singer('', '')} // Human に追加しても Human.prototype.sayName = function() { alert(this.name); }; // Singer に追加される。 new Singer('あまちゃん', '紫錦台中学校校歌').sayName();