てみたの不思議空間【後ろ】

フィーリングで感じたことを書く

Arctic.jsのクラス継承の挙動が分からなかったのでメモ

JavaScriptはprototypeベースのクラス継承なんだけど、
Arctic.js とか enchant.js ではJavaのように
クラスベースのクラスが用意されてます。

Arctic.jsのコンストラクタの挙動が分かってなかったので簡単メモ。

これはスプライトを継承したクラスを作っています。

var Player = arc.Class.create(arc.display.Sprite, {
    initialize:function(name){
        console.log(name);
    }
});

これをnewしたときにスーパークラスのコンストラクタは呼ばれるか?
これは Yes.

継承先のコンストラクタは呼ばれるか?
これも Yes.

nameには何が入っているのか?
これは new したときの引数がそのままnameに入っている。

なんで勝手にスーパークラスのコンストラクタが呼ばれるんだと、
分からなくなっていました。
じゃあスーパークラスをどうやって制御するかというと
Arctic.js には $super という引数があるそうです。

$superを使ったクラス継承を作ります。

var Player = arc.Class.create(arc.display.Sprite, {
    initialize:function($super, name){
        console.log(name);
    }
});

スーパークラスのコンストラクタは呼ばれるか?
これは No. 引数に$superを取ると呼ばれなくなるようです。

nameには何が入っているのか?
これも new したときの引数がそのままnameに入っている。

$superには何が入っているのか?
スーパークラスの関数を呼び出す関数が入っている。

$superの使い方はこうです。

var Player = arc.Class.create(arc.display.Sprite, {
    initialize:function($super, name){
        $super(name)
        console.log(name);
    }
});

これは$superを省略した時と同じ動作になります。

nameには何が入っているのか?
これも new したときの引数がそのままnameに入っている。

Javaを使っていた人にとってはスーパークラスの関数を引数に取ることは、
トリッキーにみえるかもしれないです。