非標準
概要
オブジェクトで定義されていない関数を呼び出した時に実行される関数を表します。
Object オブジェクトのメソッド |
|
|---|---|
| 実装されたバージョン | JavaScript ? |
| ECMAScript エディション | 定義されていない |
構文
obj.__noSuchMethod__ = fun
引数
-
fun -
以下の引数をとる関数
function (id, args) { . . . }-
id - 呼び出された未定義の関数の名前
-
args - その関数へ渡された引数の配列
-
説明
オブジェクトで定義されていない関数の呼び出しを試みても、標準の挙動では TypeError 例外が投げられるだけです。オブジェクトのメンバー関数として __noSuchMethod__ を定義しておく事でこの挙動を回避できます。
__noSuchMethod__ として定義される関数は 2 つの引数をとります。 1 つ目の引数は呼び出しが試みられた関数の名前を表し、 2 つ目の引数はその関数へ渡された引数の配列を表します。この 2 つ目の引数は実配列です。配列を模したオブジェクトである arguments オブジェクトではありません。(Array.prototypeを継承した Array インスタンスの事を実配列と言います。)
__noSuchMethod__ が undefined であるかデリートされている、あるいは関数以外である場合には、JavaScript エンジンは通常どおり TypeError 例外を投げます。
例
例: __noSuchMethod__ の基本的な使い方
例えば、あなたのプロジェクトにある errorize メソッドが将来的に廃止されるとします。理由は errorize と言う名前が機能性を充分に表しておらず、 かつ log と言う新しいメソッドでエラーや警告等への対処をする為です。
その場合には、 __noSuchMethod__ から log を以下の様に呼び出す事で errorize の機能を置き換える事ができます。
wittyProjectName.log = function log (message, type) {
if (type == 0) {
// エラーを記録する
} else if (type == 1) {
// 警告を記録する
}
}
wittyProjectName.__noSuchMethod__ = function __noSuchMethod__ (id, args) {
if (id == 'errorize') {
wittyProjectName.log("wittyProjectName.errorize has been deprecated.\n" +
"Use wittyProjectName.log(message, 0) instead.", 1);
wittyProjectName.log(args[0], 0); // エラーログへメッセージを記録する
}
}