Flashのクラスは通常のプログラミングと同様に修飾子が存在します。
修飾子 | アクセス可能範囲 |
---|---|
public | どこからでもアクセス可能 |
private | 同じクラス内からのみアクセス可能 |
protected | 同じクラス、及び子クラス(継承クラス)からアクセス可能 |
internal | 同じパッケージ内からのみアクセス可能 |
でも、JavaScriptにはpublicしか存在しない。。。
どうやって制御したものか・・・
swf2jsのクラスにはFlashが定義した関数とそれを実現する為の関数が存在してます。
packageクラスの変数や関数を追加すると混沌としたクラスになってしまうので、まずは別空間を準備しようと思います。
仕様書を見る限り、変数や関数はtraitに格納されています。
別空間として、traitを格納先として利用しようと思います。
そして、必要になったタイミングでクラスの別空間に格納して利用すれば実現できるのではないかと思いました。
別空間を準備する
各クラスが拡張されてもいいようにObjectクラスに
variables
という空間を準備してMapクラスのkey-valueで管理をする。
修飾子 | アクセス可能範囲 |
---|---|
public | そのままの名前を利用 |
private | クラスにナンバリングを行い、id_名前で管理する |
protected | クラス===JSのクラスか、クラス instanceof JSのクラスで判定して通過すればそのままの名前で管理 |
internal | namespaceが存在するので、namespace_名前で管理する |
public
// 取得
variables.get(name);
// 配置
variables.set(name, value);
private
// 取得
if (package.id === scope.packageId) {
variables.get(package.id +"_"+ name);
}
// 配置
if (package.id === scope.packageId) {
variables.set(package.id +"_"+ name, value);
}
protected
// 取得
const package = getPackage(namespace);
if (scope instanceof package) {
variables.get(name);
}
// 配置
if (scope instanceof package) {
variables.set(name, value);
}
internal
// 取得
if (scope.namespace === trait.namespace) {
variables.get(trait.namespace +"_"+ name);
}
// 配置
if (scope.namespace === trait.namespace) {
variables.set(trait.namespace +"_"+ name, value);
}
サクッと書いたのですが、思いつくまでが凄く大変だったのですが
思いついてしまえば、とてもシンプルな構成になりました。
ただ、public以外は判定式が入るので、どうしてもオーバヘッドが発生してしまいます。
ここは今も頭を抱えてるポイントです...。
何かいい案がある方は是非、コメントいただければ嬉しいです
明日は紀平さん(@tkihira)の「知られざる globalCompositeOperation テクニック」です!!
凄く楽しみにしていたので、是非一読頂ければと思います!!