instanceof

今まで意識して使ったことがなかったが
どこかで役立つかも。

instanceof 演算子

instanceof 演算子

object instanceof classConstructor

object が classConstructor のインスタンスまたは classConstructor のサブクラスであるかどうかをテストします。instanceof 演算子は、プリミティブタイプをラッパーオブジェクトに変換しません。たとえば、次のコードは true を返します。

new String(“Hello”) instanceof String;

一方、次のコードは false を返します。

“Hello” instanceof String;

SWFAddress

SWFAddress

1つのswf内でコンテンツ毎にURLを持てる。
ブラウザのアドレス、タイトルバーを書き換える。
ブラウザの「戻る」が使えるようになる。

フレーム1

/* ActionScript2 */

var init:Init = new Init(this);

Init.as (要: SWFAddress.as, SWFAddressEvent.as)

/* ActionScript2 */

import mx.utils.Delegate;

class Init {

private var _mc:MovieClip;

public function Init(mc:MovieClip){
this._mc = mc;
this.initSWFAddress();
//ボタンイベント(仮)
this._mc.btn_mc.onRelease = Delegate.create(this, function(){
this.sendSWFA();
});
}

//SWFAddressの初期設定
function initSWFAddress() {
SWFAddress.onChange = Delegate.create(this, this.onChangeSWFA);
};

//SWFAddress変化時のイベント受取り
private function onChangeSWFA():Void{
var val = SWFAddress.getValue();
//とりあえず画面上に出力
this._mc.tf.text = val;
//タイトルを変える
SWFAddress.setTitle("test");
}

//SWFAddressに値を送る
private function sendSWFA():Void{
SWFAddress.setValue(String(Math.random()));
}
}

index.html

<!-- HTML -->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>swfa</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="js/swfobject.js"></script>
<script type="text/javascript" src="js/swfaddress.js"></script>
<style type="text/css"></style>
</head>
<body>
<div id="content"></div>
<script type="text/javascript">
// <![CDATA[
var so = new SWFObject('swfa.swf', 'website', '640', '480', '8', '#000000');
so.useExpressInstall('js/expressinstall.swf');
so.addParam('menu', 'false');
so.write('content');
// ]]>
</script>
</body>
</html>

- 参考サイト
Flashのパーマリンク問題をSWFAddressで解決
Asual >> SWFAddress - Deep linking for Flash

arguments.caller

[object global]

AS2でおなじみの手法は
AS3で「望ましくないイベントリスナー登録の方法」になったらしい。
バインドメソッドメソッドクロージャの理解はやはり重要。

イベントリスナー — Flex 2.01 望ましくないイベントリスナー登録の方法

第 3 のテクニックとして、汎用オブジェクトを作成し、そのオブジェクトのプロパティによって動的にリスナー関数を割り当てる方法がありますが、これを使用することはお勧めできません。この方法を説明するのは、ActionScript 2.0 で一般的に使用されていたという理由からです。ActionScript 3.0 では使用しないでください。このテクニックでは this キーワードの参照先がリスナーオブジェクトではなくグローバルオブジェクトになるため、望ましくありません。

[object global] というのが、参照先を見失ってしまっている状態?

/* ActionScript3 */

import flash.events.MouseEvent;

var testData1:String = "TEST1";

var myListenerObj:Object = new Object();
myListenerObj.testData2 = "TEST2";
myListenerObj.onMouseUpFunc1 = function (e:MouseEvent):void
{
trace("event.type: " + e.type); //結果: event.type: mouseDown
trace("this: " + this); //結果: this: [object global]
trace("this.testData1: " + this.testData1); //結果: this.testData1: undefined
trace("this.testData2: " + this.testData2); //結果: this.testData2: undefined
};

function onMouseUpFunc2 (e:MouseEvent):void {
trace ("event.type: " + e.type); //結果: event.type: mouseUp
trace ("this: " + this); //結果: this: [object MainTimeline]
trace ("this.testData1: " + this.testData1); //結果: this.testData1: TEST1
}

stage.addEventListener (MouseEvent.MOUSE_DOWN, myListenerObj.onMouseUpFunc1);
stage.addEventListener (MouseEvent.MOUSE_UP, this.onMouseUpFunc2);

this の参照先は myListenerObj であるかのように見え、トレース出力も [object Object]
になっていますが
(なっていない…)、実際の参照先はグローバルオブジェクトです。動的なプロパティ名を addEventListener() のパラメータとして指定した場合、Flash Player はバインドメソッドを作成できません。なぜなら、その場合に listener パラメータとして渡されるのはリスナー関数の単なるメモリアドレスであり、Flash Player がそのメモリアドレスと myListenerObj インスタンスを結び付ける手段がないからです。

more >

文化庁メディア芸術祭 審査委員会推薦作品 台風前線

Function.apply

Delegateメソッドクロージャと関連して、Function.apply。
function test1():void{ } で定義したメソッドは apply が効かない。

/* ActionScript3 */

function test1():void{
trace(this);
}

var test2:Function = function():void{
trace(this);
}

var obj:Object = new Object();
this.test1.apply(obj); //結果: [object MainTimeline]
this.test2.apply(obj); //結果: [object Object]

“this 参照が、常にこのメソッドを実装する元のオブジェクトを指している”
が test1 (バインドメソッド)
“this 参照は汎用的で、呼び出されたときにこの関数が関連付けられているオブジェクトを指”す
が test2 (メソッドクロージャ)

メソッド — Flex 2.01

バインドメソッドは、メソッドクロージャとも呼ばれる、単にインスタンスから抽出されるメソッドです。バインドメソッドの例には、関数にパラメータとして渡され、関数から値として返されるメソッドがあります。ActionScript 3.0 で新しく導入されたバインドメソッドは、インスタンスから抽出されたときでもレキシカル環境が保持されるメソッドクロージャに似ています。バインドメソッドとメソッドクロージャの主な違いは、バインドメソッドの this 参照は、バインドメソッドを実装するインスタンスにリンクされたまま、つまりバインドされたままであるという点です。これは、バインドメソッドの this 参照が、常にこのメソッドを実装する元のオブジェクトを指していることを意味します。メソッドクロージャの場合、this 参照は汎用的で、呼び出されたときにこの関数が関連付けられているオブジェクトを指します。

more >

Tweener.addTween(this, {_param:0, time:1});

TweenerでaddTweenするオブジェクト指定で this が使えた。
3次元の座標を持ったクラスで移動や回転の処理する時などに便利。
今まで同じことするのに3倍くらい無駄な書き方してた。

/* ActionScript2 */

var _param:Number = 20;
Tweener.addTween(this, {_param:0, time:1, onUpdate:function():Void{trace(this._param);}});

/*結果:
12.2186291796976
9.64902265253771
7.6720602823465
(省略)
0.010466552509385
0.00423725405545383
0 */

Hatena Star

Movable Type4にはてなスターを設置2 – TREND SPOTTING
を参考にMT4ではてなスターを設置。

テンプレートモジュール / ヘッダー

<script type="text/javascript" src="http://s.hatena.ne.jp/js/HatenaStar.js"></script>
<script type="text/javascript">
Hatena.Star.EntryLoader.headerTagAndClassName = ['span','star'];
Hatena.Star.Token = 'トークン';
</script>

テンプレートモジュールを / ブログ記事の詳細

<h1 class="asset-name"><$MTEntryTitle$><span class="star"><a href="<$MTEntryPermalink$>" class="hidden"><$MTEntryTitle$></a></span></h1>

テンプレートモジュール / ブログ記事の概要

<h2 class="asset-name"><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><span class="star"><a href="<$MTEntryPermalink$>" class="hidden"><$MTEntryTitle$></a></span></h2>

インデックステンプレート / スタイルシート(ベーステーマ)

.star .hidden {
display: none;
}

- 参考サイト
Movable Type4にはてなスターを設置2 - TREND SPOTTING
はてなスターはじめてガイド - Hatena Star

メソッドクロージャ

AS3の「メソッドクロージャ」が実はとても役立つことがわかった。

関数スコープ — Flex 2

メソッドクロージャ
ActionScript 3.0 では、元のオブジェクトインスタンスを自動的に記憶するメソッドクロージャが有効です。この機能はイベント処理に役立ちます。ActionScript 2.0 では、メソッドクロージャに抽出元のオブジェクトインスタンスが記憶されず、メソッドクロージャが呼び出されたときに予期しない動作が発生しました。mx.utils.Delegate クラスは一般的な方法でしたが、不要になりました。

Flex2/ActionScript3.0/関数 – PukiWiki

* 関数をクラスの一部として定義した場合と、インスタンスに関連付けた場合はメソッドと呼ぶ。
* それ以外の方法で定義された場合はメソッドクロージャと呼ぶ

上から2つ目のtrace(this)の結果 “[object MainTimeline]” がメソッドクロージャの効果。

/* ActionScript3 */

Tweener.addTween(this._btnMc, {alpha: 0.5, time:1, onComplete: function():void{trace(this);}});
//結果: [object MovieClip] (addTweenで扱ったオブジェクト)

Tweener.addTween(this._btnMc, {alpha: 0.5, time:1, onComplete: this.onCompleteFunc});
private function onCompleteFunc():void{
trace(this);
}
//結果: [object MainTimeline] (addTween呼び出し元のthis)

AS2ではこうならなかった。

/* ActionScript2 */

Tweener.addTween(this._btnMc, {_alpha: 50, time:1, onComplete: function():Void{trace(this);}});
//結果: _level0.btn_mc (addTweenで扱ったオブジェクト)

Tweener.addTween(this._btnMc, {_alpha: 50, time:1, onComplete: this.onCompleteFunc});
private function onCompleteFunc():void{
trace(this);
}
//結果: _level0.btn_mc (addTweenで扱ったオブジェクト)

more >

SWFMacMouseWheel