Please note, this is a STATIC archive of website developer.mozilla.org from November 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Object.prototype.watch()

この翻訳は不完全です。英語から この記事を翻訳 してください。

Warning: Generally you should avoid using watch() and unwatch() when possible. These two methods are implemented only in Gecko, and they're intended primarily for debugging use. In addition, using watchpoints has a serious negative impact on performance, which is especially true when used on global objects, such aswindow. You can usually use setters and getters or proxies instead. See Browser compatibility for details. Also, do not confuse Object.watch with Object.observe.

概要

プロパティに値が代入されるのを監視し、代入された際に関数を実行します。

構文

object.watch(
prop,
handler)

引数

prop
オブジェクトのプロパティの名前。
handler
呼び出す関数

説明

名前が prop であるオブジェクト中のプロパティへの代入処理を監視し、prop に値がセットされたときには毎回 handler(prop, oldval, newval) を呼び出して、その返り値をプロパティに保存します。ウォッチポイントは修正した newval を返す(あるいは oldval を返す)ことにより、値の代入をフィルタリング(または無効化)することができます。

ウォッチポイントがセットされたプロパティを削除しても、そのウォッチポイントは消滅しません。その後プロパティを再生成しても、ウォッチポイントは効果を持ち続けます。

ウォッチポイントを削除するには、unwatch メソッドを使います。デフォルトで、watch メソッドは Object の子孫であるあらゆるオブジェクトに継承されています。

JavaScript のデバッガは他のデバッグ用オプションと同様に、このメソッドで提供されるものと機能的に似たものを有しています。デバッガについての情報は Venkman をご覧ください。

In Firefox, handler is only called from assignments in script, not from native code. For example, window.watch('location', myHandler) will not call myHandler if the user clicks a link to an anchor within the current document. However, window.location += '#myAnchor' will call myHandler.

Note: Calling watch() on an object for a specific property overrides and previous handler attached for that property.

例: watchunwatch を使う

var o = { p : 1 };

o.watch("p", function (id,oldval,newval) {
  console.log(
    "o." + id + " は " +
    oldval + " から " +
    newval + " に変更されました"
  );

  return newval;
});

o.p = 2;
o.p = 3;
delete o.p;
o.p = 4;

o.unwatch('p');
o.p = 5;

コンソールへの出力は以下の様なものになります。

o.p は 1 から 2 に変更されました
o.p は 2 から 3 に変更されました
o.p は undefined から 4 に変更されました

例: watch を使ってオブジェクトのプロパティの妥当性を評価する

watch を使えば、オブジェクトのプロパティへのあらゆる代入操作を検査することができます。この例はどの Person も常に妥当な名前と 0 から 200 までの年齢を保持することを保証します。

Person = function(name, age) {
  this.watch('age', Person.prototype._isValidAssignment);
  this.watch('name', Person.prototype._isValidAssignment);
  this.name = name;
  this.age = age;
};

Person.prototype.toString = function() {
  return this.name + ', ' + this.age;
};

Person.prototype._isValidAssignment = function(id, oldval, newval) {
  if (id === 'name' && (!newval || newval.length > 30)) {
    throw new RangeError('invalid name for ' + this);
  }
  if (id === 'age'  && (newval < 0 || newval > 200)) {
    throw new RangeError('invalid age for ' + this);
  }
  return newval;
}

will = new Person('Will', 29);
print(will);   // Will, 29

try {
  will.name = '';
} catch (e) {
  print(e);
}

try {
  will.age = -4;
} catch (e) {
  print(e);
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

このスクリプトは以下のように表示します。

Will, 29
RangeError: invalid name for Will, 29
RangeError: invalid age  for Will, 29

Specifications

Not part of any specifications. Implemented in JavaScript 1.2.

互換性

  • This Polyfill that offers watch to all ES5 compatible browser
  • Using a Proxy enables you do that even deeper changes to how property assignments work 
Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 未サポート (有) 未サポート 未サポート 未サポート
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support 未サポート 未サポート (有) 未サポート 未サポート 未サポート

Note: Calling watch() on the Document object throws a TypeError since Firefox 23 (バグ 903332). This regression has been fixed with Firefox 27.

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: teoli, hinaloe, ethertank, Mgjbot, Potappo, Yuichirou
 最終更新者: teoli,