Macromedia Flash非公式テクニカルノート

__proto__による継承でsuperを使う

ID: FN0204002 Product: Flash

Platform: All
Version: MX

1. __proto__プロパティを使った継承
'__proto__'プロパティを使った継承は、Flash Player 6のサポート外となりました。このプロパティは、読取り専用として扱う必要があるとされています(「ActionScript Coding Standards」p.14参照)。実際上も、サブクラスの'__proto__'プロパティにスーパークラスの'prototype'を設定した場合には、'super'演算子を使ってスーパークラスのコンストラクタを呼出すことができません(別途、「super」を参照)。

他方で、'__proto__'プロパティを使って継承を行うと、サブクラスの'prototype'プロパティを書替えることがありません。とくに、多重継承を行う際には、その設計がしやすく、また拡張も柔軟に行えるという利点があります。

2. __constructor__プロパティの設定
ドキュメントに記載されていない、コンストラクタを参照するプロパティとして'__constructor__'があります。この設定を行うことにより、'__proto__'プロパティにスーパークラスの'prototype'を継承した場合にも、'super'演算子でスーパークラスのコンストラクタを呼出すことができるようになります。

Person = function (name) {
   this.name = name;
};
Person.prototype.getInfo = function() {
   return this.name;
};
Profile = function (name, hobby) {
   super(name);
   this.hobby = hobby;
};
Profile.prototype.getInfo = function() {
   var name = super.getInfo();
   return name+":"+this.hobby;
};
// '__proto__'プロパティにスーパークラスの'prototype'を継承
Profile.prototype.__proto__ = Person.prototype;
// '__constructor__'にスーパークラスのコンストラクタを設定
Profile.prototype.__constructor__ = Person;
// ASSetPropFlags(Profile.prototype, ["__constructor__"], 1); // '__constructor__'プロパティを隠す
madScripter = new Profile("Fumio", "Bug fixing");
trace(madScripter.getInfo());
// 出力ウィンドウの結果
Fumio:Bug fixing

サブクラスの'prototype'プロパティにコンストラクタのオブジェクトインスタンスを設定した場合(「superでスーパークラスのメソッドを実行する」)と同様に、スーパークラスの初期化とそのメソッドの呼出しができます。

なお、生成されたサブクラスのインスタンスを'for...in'アクションで調べると、プロパティとして'__constructor__'が検出されます。ドキュメント化されていない'ASSetPropFlags'関数を使うと、指定したプロパティを検出されないように隠すことができます(関数について詳しくは、FlashCoders WikiのUndocumented Featuresに掲載されている"ASSetPropFlags"をご参照ください)。上記サンプルで、'__constructor__'を設定したステートメントのつぎのコメント行を有効にすると、この設定が行われます。

_____

作成者: 野中文雄
更新日: 2002年4月29日 サンプルスクリプト中の不要な記述削除
作成日: 2002年4月9日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.