プロトタイプ型オブジェクト指向とは
プロトタイプ型オブジェクト指向とはプロトタイプ理論に基づいたオブジェクト指向である。
プロトタイプ型オブジェクト指向ではプロトタイプチェーンが重要である。
(以下略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();