右クリックからメソッドを呼び出した場合、thisがundefinedになりますた。。。
AS2っす。
var my_cm:ContextMenu = new ContextMenu();
my_cm.customItems.push(new ContextMenuItem("hoge", hoge));
function hoge(obj, item) {
trace(this); // undefined
}
this.menu = my_cm;
そーいうもんなのかな。
fladdict.net blog: JavaScript, ActionScriptにおける .this とは何なのか?
http://www.fladdict.net/blog-jp/archives/2005/09/javascript_acti.php
これを読むと、thisってのは
「その関数を、何のプロパティと解釈して呼び出したか?」
とあるけど、この場合、関数は「未定義な何か」から呼び出されたってことなのか。。。
うーん、よくわからん。
追記
ActionScript3でやってみた
呼び出されたメソッドのthisは「[object ContextMenuExample]」だった
package {
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;
import flash.events.ContextMenuEvent;
import flash.display.Sprite;public class ContextMenuExample extends Sprite {
private var myContextMenu:ContextMenu;public function ContextMenuExample() {
myContextMenu = new ContextMenu();
var item:ContextMenuItem = new ContextMenuItem("hoge");
myContextMenu.customItems.push(item);
item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, hoge);
this.contextMenu = myContextMenu;
}private function hoge(event:ContextMenuEvent):void {
trace(this); //[object ContextMenuExample]
}}
}




コメント (3)
AS2のやつは、ただ関数を渡してるだけなので、thisを参照しても何もないんじゃない?
Deleagateクラスを使ってみよ
import mx.utils.Delegate;
var my_cm:ContextMenu = new ContextMenu();
my_cm.customItems.push(new ContextMenuItem("hoge", Delegate.create(this, hoge)));
function hoge(obj, item) {
trace(this); // _level0
}
this.menu = my_cm;
投稿者: {eL_e3電気を大切に | 2007年02月15日 13:43
日時: 2007年02月15日 13:43
Deleagateクラス使えばきれいに書けますね。
ありがとうございます。
でもthisがundefinedになるってのがどーしても気持ち悪いなー
投稿者: yo-suke | 2007年02月15日 14:15
日時: 2007年02月15日 14:15
>でもthisがundefinedになるってのがどーしても気持ち悪いなー
あー、そういうことですか。
たぶんContextMenuItemはFlash playerがOSの機能を利用して表示してるわけで、FlashのコンポーネントやMCじゃないってことじゃないですかね。
だからコンストラクタでコールバックを指定したら変更できないし、ラベルも書き換えできないんじゃないでしょか
最初、内部で
function func(){
trace(this)
}
func.call(undefined);
とでもなってるかと思ったんですけど、
これだと出力が
[type Object]
なんですよね。確かに気持ち悪いわ
投稿者: {eL_e3 | 2007年02月16日 20:38
日時: 2007年02月16日 20:38