サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

Object.watch()

ID: FN0310001 Product: Flash

Platform: All
Version: MX and above

シンタックス
myObject.watch(プロパティ, コールバック[, ユーザーデータ])

引数
プロパティ   監視(watch)するオブジェクトプロパティの名前を指定するストリング。

コールバック   監視しているプロパティが変更されたときに呼出す関数。この引数はFunctionオブジェクトです。ストリングの関数名ではありません。コールバックのスタイルは、callback(プロパティ, 既定値, 新規の値, ユーザーデータ)となります。

ユーザーデータ   コールバックメソッドに渡す任意のActionScriptデータ。引数ユーザーデータを省略すると、コールバックメソッドには'undefined'が渡されます。この引数は、オプションです。

戻り値
ウォッチポイント(watchpoint)が正しく作成されると値は'true'、それ以外は'false'の値を返します。

説明
メソッド; イベントハンドラ([訳者註] コールバック関数)を登録して、指定したActionScriptオブジェクトのプロパティが変更されたときにそれを呼出します。プロパティが変更されると、コールバック関数はmyObjectをプロパティの帰属するオブジェクトとして呼出されます。新規の値は、'Object.watch()'メソッドから返す必要があります。戻り値がないと、監視しているオブジェクトプロパティには'undefined'が値として設定されます。

[訳者註] コールバック関数に渡される4つの引数の内容は、以下のとおりです。

プロパティ   ウォッチポイントが設定され、値の変更されたプロパティ名のストリング。
既定値   プロパティに設定された変更前の値。
新規の値   プロパティに設定されようとしている新規の値。この設定の操作により、ウォッチポイントが起動し、コールバック関数が呼出されます。
ユーザーデータ   'Object.watch'メソッドで指定された任意のユーザーデータ。

プロパティには、コールバック関数の返す値が設定されます。新規の値をそのまま設定してよければ新規の値、値の変更をさせない場合には既定値を返せばよいでしょう。値を返さなければ、プロパティは未定義値'undefined'になります。

ウォッチポイントは、値の設定をフィルタリング(あるいはプロテクト(nullify))することができます。それには、処理を加えた新規の値(または既定値)を、(訳者註: コールバック関数から)返します。ウォッチポイントを設定したプロパティを削除しても、そのウォッチポイントは消滅しません。再度そのプロパティを作成すれば、ウォッチポイントは引続き効果をもちます。ウォッチポイントを消去するには、'Object.unwatch()'メソッドを使います。

[訳者註] 'TextField.text'プロパティを'Object.watch'メソッドで監視すると、コールバック関数の第2引数となる既定値が未定義値'undefined'になるという問題があります。詳しくは、「TextField.textプロパティをwatchすると既定値が取得できない」をご参照ください。

ウォッチポイントは、ひとつのプロパティにひとつだけ登録できます。同じプロパティに対してさらに'Object.watch()'メソッドを呼出すと、前のウォッチポイントが書替えられます。

'Object.watch()'メソッドは、Netscape JavaScript 1.2以降の'Object.watch()'関数と似た動作をします。大きな違いは、引数のユーザーデータです。このパラメータは、Flashにより'Object.watch()'に追加されました。Netscape navigatorではサポートされていません。ユーザーデータを引数としてイベントハンドラ(訳者註: コールバック関数を指します)に渡せば、その値をイベントハンドラで使用できます。

'Object.watch()'メソッドは、getter/setterプロパティを監視することはできません。getter/setterプロパティは、「遅延評価(lazy evaluation)」により処理されます。これは、プロパティの値を、実際に要求されるまで決定しないというものです。「遅延評価」は、効率的なことが少なくありません。それは、プロパティをひっきりなしに更新することがないからです。つまり、それが必要になったときにだけ、評価されることになります。しかし、'Object.watch()'は、プロパティを評価してウォッチポイントを実行しなければなりません。getter/setterプロパティに対して使用するとなれば、'Object.watch'はプロパティをつねに評価し続ける必要があります。これは、非効率な処理といえます。

一般的に、ActionScriptで定義済みの'_x'や'_y'、'_width'、'_height'といったプロパティは、getter/setterプロパティです。したがって、'Object.watch()'で監視することはできません。


つぎのサンプルは、CheckBoxコンポーネントでメソッドを使って(訳者註: Flash MXのコンポーネントです。Flash MX 2004のCheckBoxコンポーネントには、これらのメソッドはありません)、CheckBoxインスタンスにラベルや値を設定しています。

myCheckBox1.setValue(true);
myCheckBox1.setLabel("new label");
...

CheckBoxの値やラベルは、プロパティとして考えられると便利です。'Object.watch()'メソッドを使えば、値やラベルに対してプロパティのようにアクセスすることができ、メソッドを呼出す必要はありません。それは、つぎのように行います。

// CheckBoxクラスのコンストラクタ定義(クラス定義)
function CheckBox() {
   ...
   this.watch('value', function(id, oldval, newval) {
     ...
   });
   this.watch('label', function(id, oldval, newval) {
     ...
   });
}

valueやlabelプロパティが変更されると、コンポーネントで指定した(訳者註: コールバック)関数が呼出されて、必要な処理が行われ、コンポーネントの表示や状態が更新されます。つぎの例は、'Object.watch'メソッドを呼出して、コンポーネントに変数が変更されたことを伝えます。それにより、コンポーネントはグラフィック上の表示を更新します。

myCheckBox1.value = false;

このシンタックスは、つぎのような以前のシンタックスより端的です。

myCheckBox1.setValue(false);

[訳者註] プロパティ値設定のメソッド呼出しを、シンタックス上プロパティを直接設定するスタイルにしたいときには、'Object.addProperty'メソッドもしくはActionScript 2.0の「暗黙的な取得/設定メソッド」([ActionScriptリファレンスガイド]>[ActionScript 2.0によるクラスの作成]参照)を使用する方が適しているでしょう。'Object.watch'メソッドは、文字どおりプロパティ値の変更をつねに監視して処理を行う場合に用いるのが本来です。

たとえば、Flash MXのScrollBarコンポーネントでは、対象となるTextFieldインスタンスの'text'プロパティ変更を監視して、スクロールバーの状態を更新していました。

Player
Flash Player 6以降。

関連項目
Object.addProperty()   Object.unwatch()

出典
ActionScript Dictionary(Flash MX 2004 Trial英文改訂版)より邦訳。

_____

作成者: 野中文雄
更新日: 2003年11月6日 訳者註で「暗黙的な取得/設定メソッド」について言及
作成日: 2003年10月5日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.