« NEW YORK CITY JAIL | Home | ソースネクストの挑戦 »

Jun 272004

ビルトインメソッドのカスタマイズ

thFlash.gif今ちょっと検証している事項の一つに「ビルトインメソッドをカスタマイズできないのか?」というものがある。たとえばこういうこと

XML.prototype.load = function(arg) {
	var filePath = "hogehoge";
	this.load(filePath+arg);
};

まぁこれだけ見ると「こんなの必要ないじゃん!」とか「loadの引数に書けばいいじゃん!」ってことになるのだけど、ちょっと環境がWEBじゃなくてローカルアプリベースで、しかもプログラムで直接SWFの中を叩いたりしているので、オーサリング環境が実動環境を再現できないという厄介な代物なわけ。つまりオーサリング環境では"load"は通常のビルトインメソッドを使用して動作検証を行い、実動環境で動かす際にはプログラム的にカスタムメソッドをSWFの中に埋め込んでしまって、強制的に実動環境に対応するようにしてしまおうということ。
まぁ単純に上記の書き方だとずっと"load"を参照するので無限ループに入ってしまうわけですが、たとえば

XML.prototype.load2 = function(arg) {
	this.load(arg);
};
XML.prototype.load = function(arg) {
	this.load2(filePath+arg);
};

とか

XML2 = function () {
};
XML2.prototype = new XML();
//--------------------------------
XML.prototype.load = function(arg) {
	this = new XML2();
	var filePath = "hogehoge";
	this.load(filePath+arg);
};

とかして逃がしてみるものの、やっぱ参照しているところは"XML.load()"だからか望むような動きにはならない。うまく状況が説明できないのだけど、簡単な例で言えばオーサリング時には通常の"XML.load()"の機能で動作しデバッグできるのだけど、全体として組み込んだときに

XML.prototype.load = function(arg){
 	trace("load するようーー");
	this.load(arg);
}

という風に動作するようにビルトインを変えたいわけです。
こー書くと「元からカスタムメソッドで書けばいいじゃなぃ!」という話になるのですが、そのカスタムオブジェクトはオーサリング環境では適応できないという非常に特殊な環境なのです。うーんなんというか状況を伝えるのが非常に難しいものだなーー。

1 Comment

と思ったら解決。
----
XML.prototype.load2 = XML.prototype.load;
XML.prototype.load = function(url) {
var filePath = _root._url.substr(0, _root._url.lastIndexOf("/")+1);
this.load2(filePath+url);
};
----
"function"指定ではなく、直接代入して、その後でカスタムすればもともとの"load"は"load2"に移譲されますた。
http://www.flash-jp.com/modules/newbb/viewtopic.php?viewmode=flat&topic_id=1515&forum=6

Leave a comment

Search and Archives