メイン ActionScript 3.0 特設会議室 Function.apply の this について | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
takanism | Åê¹ÆNo.34614 投稿日時: 2007-8-9 21:03 |
新米 居住地: 投稿: 3
使用環境:
WinXP SP2 Flash CS3 |
Function.apply の this について お世話になっております。
かなり悩んだのですが、どうしても分からないので質問させていただきます。 Function.apply についてです。 このメソッドの第一引数には、適用先オブジェクトを指定しますよね。 そこで以下のコードをメインタイムラインの第一フレームに書きました。 ---------- var mc:MovieClip = new MovieClip; addChild(mc); function test ():void { trace(this); } trace(this); trace(mc); test(); test.apply(mc); ---------- 期待したトレース結果は、 [object MainTimeline] [object MovieClip] [object MainTimeline] [object MovieClip] なのですが、実際の出力は以下でした。 [object MainTimeline] [object MovieClip] [object MainTimeline] [object MainTimeline] mc を基準として test を呼ぶので、test 内の this は mc を指す。 という理解をしてたんですが…。 出力結果がそうなっているので自分の理解が間違っているとは思いますが、 そうなるとこの第一引数は意味が無いのではと思えてきます。 よろしければご教授いただければと思います。 |
ニノミヤ カズノリ | Åê¹ÆNo.34619 投稿日時: 2007-8-10 2:11 |
職人 居住地: 東京 投稿: 430
使用環境:
CS4 .4.11, .5.7 XP Pro(sp3) Flash Player 10,0,22,87, AIR 1.5.1, IE 5.5 & 6 & 7 & 8, Firefox 2.0.0.20 & 3.0.11 & 3.5, Opera 9.64, Safari 4, Google Chrome 2.0.172.31, Netscape 7.1 |
Re: Function.apply の this について 引用:
mc を基準として test を呼ぶので、test 内の this は mc を指す。 その証拠に、使用するActionScriptを3.0から2.0に変更してテストすると、takanismさんの期待通りの結果が表示されます。 原因としては、
ActionScript3.0にて期待通りの結果を出したい場合は、下記の様に書き直さなければなりません。
|
takanism | Åê¹ÆNo.34620 投稿日時: 2007-8-10 11:27 |
新米 居住地: 投稿: 3
使用環境:
WinXP SP2 Flash CS3 |
Re: Function.apply の this について ニノミヤさん
ご返信どうもありがとうございました。 version の違いなんですね。すっきりしました。 prototype.js の bind をやりたかったんですが、 以下のように(無意味な code ですが)普通に class 定義した method では難しいですね…。 ---------- Utilities.as package { public class Utilities { public static function bind ($func:Function, $context:Object=null, ... $rest):Function { return function (... $arg):* { return $func.apply($context, $arg.concat($rest)); } } } } ---------- Main.as = DocumentClass (not strict mode) package { import flash.display.*; public class Main extends Sprite { public function Main () { var mc:MovieClip = new MovieClip; Utilities.bind(noaction, mc)(); // this = mc これは OK Utilities.bind(noaction2, mc)(); // this = Main これは NG } public var noaction:Function = function ():void { this.gotoAndStop(1); trace('no problem.'); } public function noaction2 ():void { this.gotoAndStop(1); trace('no problem.'); } } } ---------- うーん、noaction2 が動いて欲しいなぁ(笑) みなさん bind みたいな事をされる時はどうされてるんですかねぇ…。 |
ニノミヤ カズノリ | Åê¹ÆNo.34621 投稿日時: 2007-8-10 11:53 |
職人 居住地: 東京 投稿: 430
使用環境:
CS4 .4.11, .5.7 XP Pro(sp3) Flash Player 10,0,22,87, AIR 1.5.1, IE 5.5 & 6 & 7 & 8, Firefox 2.0.0.20 & 3.0.11 & 3.5, Opera 9.64, Safari 4, Google Chrome 2.0.172.31, Netscape 7.1 |
Re: Function.apply の this について 引用:
takanismさんは書きました:
|
ニノミヤ カズノリ | Åê¹ÆNo.34623 投稿日時: 2007-8-10 12:28 |
職人 居住地: 東京 投稿: 430
使用環境:
CS4 .4.11, .5.7 XP Pro(sp3) Flash Player 10,0,22,87, AIR 1.5.1, IE 5.5 & 6 & 7 & 8, Firefox 2.0.0.20 & 3.0.11 & 3.5, Opera 9.64, Safari 4, Google Chrome 2.0.172.31, Netscape 7.1 |
Re: Function.apply の this について
|
takanism | Åê¹ÆNo.34624 投稿日時: 2007-8-10 17:26 |
新米 居住地: 投稿: 3
使用環境:
WinXP SP2 Flash CS3 |
Re: Function.apply の this について お世話になっております。
引用: 上記のコードをnoactionと同じ書き方にすれば期待通りの動きをしますが、それでは駄目なのでしょうか? いえ、全然大丈夫です。 何となく noaction2 の書式で動いて欲しい気がした、というだけですので。 お騒がせしました。 また、参考リンクもどうもありがとうございました。 さっそく読んでみますね。 いろいろとご教授どうもありがとうございました。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
投稿するにはまず登録を | |