IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

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

ふと思った。

jsolait すごいじゃん。(他にもすごいことがいっぱい・・)
http://jsolait.net/

ど、ど、動的ロードも(おっと脱線、また今度・・)