Macromedia Flash非公式テクニカルノート
superでスーパークラスのメソッドを実行する
ID: FN0204001 |
Product: Flash |
Platform: All
Version: MX
1. superによるスーパークラスの初期化とメソッドの実行
MXから実装された'super'演算子を使用すると、サブクラスのコンストラクタでスーパークラスを初期化したり、サブクラスのメソッドからスーパークラスのメソッドを呼出すことができます。'super'演算子の使用法方について理解するためには、「継承」に関する基本的な知識が必要となります。「継承」については、オンラインヘルプ「ActionScript 言語について」>「カスタムオブジェクトについて」>「継承の作成」をご参照ください。
サブクラスのコンストラクタでスーパークラスを初期化し、サブクラスのメソッドからスーバークラスのメソッドを呼出すスクリプトのサンプルが、以下です。
Person = function (name) {
this.name = name;
};
Person.prototype.getInfo = function() {
return this.name;
};
Profile = function (name, hobby) {
// [1]スーパークラスのコンストラクタを呼出して初期化
super(name);
this.hobby = hobby;
};
// [2]スーパークラスのインスタンスを'prototype'に継承
Profile.prototype = new Person();
// [3]サブクラスにメソッドを設定
Profile.prototype.getInfo = function() {
// [4]スーパークラスのメソッドを呼出す
var name = super.getInfo();
return name+":"+this.hobby;
};
// [5]コンストラクタによるインスタンスの生成とメソッドの実行
madScripter = new Profile("Fumio", "Bug fixing");
trace(madScripter.getInfo());
// 出力ウィンドウの結果
Fumio:Bug fixing
スクリプト中に記載したコメントに沿って、簡単にご説明します。
[1]サブクラス"Profile"のコンストラクタの中で、スーパークラスを'super'演算子で呼出し、引数を渡しています。ただし、コンストラクタを定義した段階では、まだ関数中のステートメントは実行されません。実際に処理が行われるのは、[5]でコンストラクタを呼出したときになります。
[2]サブクラス"Profile"の'prototype'プロパティに、スーパークラス"Person"のコンストラクタから生成したオブジェクトインスタンスを設定しています。
注意しなければいけないのは、このステートメントは、サブクラスの'prototype'プロパティを、スーパークラスのオブジェクトインスタンスで書替えているということです。したがって、サブクラスの'prototype'にメソッドやプロパティを設定するのは、このステートメントの後に行わなければなりません。たとえば、つぎの[3]のメソッド設定をこのステートメントより前に記述すると、その設定は'prototype'プロパティの書替えによってクリアされてしまいます。
また、[1]でスーパークラスを初期化する前に、このステートメントがコンストラクタを呼出していることにも、留意しておく必要があります。たとえば、スーパークラスの初期化で、コンストラクタが呼出された回数をプロパティなどに使用する場合は、この処理が回数にカウントされてしまうことになります。
[3]サブクラスの'prototype'プロパティに、メソッドを設定しています。
[4]メソッド中で、'super'演算子を使ってスーパークラスの同名のメソッドを呼出しています。
2. コンストラクタ中に定義したメソッド
前述のサンプルでは、メソッドをクラスの'prototype'プロパティに定義しました。これに対して、メソッドをコンストラクタの中でインスタンスに対して設定する方法も考えられます。けれど、この方法は推奨されていません(オンラインヘルプ「ActionScript 言語について」>「カスタムオブジェクトについて」>「カスタムオブジェクトにメソッドを割り当てるには」参照)。コンストラクタからオブジェクトを生成するたびに、インスタンスに対して個別にメソッドが定義されることになるからです。
'super'演算子でスーパークラスのメソッドを実行する場合には、スーパークラスのコンストラクタ中で定義したのでは、正しく呼出すことができません。前述のサンプルのメソッド定義を、コンストラクタ中で行うように書替えたのが以下のスクリプトです。
Person = function (name) {
this.name = name;
// コンストラクタ中でメソッドを定義
this.getInfo = function() {
return this.name;
};
};
Profile = function (name, hobby) {
super(name);
this.hobby = hobby;
// コンストラクタ中でメソッドを定義
this.getInfo = function() {
var name = super.getInfo();
return name+":"+this.hobby;
};
};
Profile.prototype = new Person();
madScripter = new Profile("Fumio", "Bug fixing");
trace(madScripter.getInfo());
// 出力ウィンドウの結果
:Bug fixing
出力ウィンドウの結果を見ると、スーパークラス"Person"のコンストラクタ中に定義したメソッドが呼出されていません。'super'演算子を使って呼出すメソッドは、クラスの'prototype'に定義する必要があります。
3. __proto__を使った継承
「__proto__による継承でsuperを使う」をご参照ください。
_____
作成者: 野中文雄
更新日: 2003年5月15日 スクリプト中の不要な引数削除
更新日: 2002年4月29日 スクリプト中の改行漏れ修正
作成日: 2002年4月9日
Copyright ©
2001-2006 Fumio Nonaka. All rights reserved.
|