33

__callPHPでは、「マジック」関数を使用して、メソッドが存在しない場合でもメソッドが呼び出されたことを検出できます。

public function __call($methodName, $args)
{
    // do something
}

任意のメソッドを呼び出すことができ、名前と引数がこの魔法のキャッチオールに渡されます。

オブジェクトに実際に存在していなくても、任意のメソッドを呼び出すことができる同様の手法がJavaScriptにありますか?

var foo = (function () {
    return {
         __call: function (name, args) { // NOT REAL CODE
             alert(name); // "nonExistent"
         }
    }
}());

foo.nonExistent();
4

5 に答える 5

31

ES6 Proxy APIを使用して可能です:

var myObj = {};
var myProxy = new Proxy(myObj, {
  get: function get(target, name) {
    return function wrapper() {
      var args = Array.prototype.slice.call(arguments);
      console.log(args[0]);
      return "returns: " + args[0];
    }
  }
});
console.log(myProxy.foo('bar'));

ブラウザの互換性はMDNで入手できます。2017 年 8 月現在、Internet Explorer を除くすべてのブラウザー (Microsoft Edge を含む) がサポートしています。

Proxy の詳細については、この回答を参照してください。

于 2013-10-22T14:42:18.497 に答える
9

Gecko 43 以降廃止 (Firefox 43 / Thunderbird 43 / SeaMonkey 2.40)

__noSuchMethod__Firefox で使用できます。残念ながら規格外です…

関連する質問:プロパティの __noSuchMethod__ 機能に相当するもの、または JS で実装する方法はありますか?

于 2012-04-19T10:28:03.263 に答える
3

いいえ。JavaScript の動作方法により、同等のものは、PHP の ではなくPython の__getattr__/のようになります。これは、属性を呼び出すときではなく、取得するときに処理する必要があるためです。__getitem____call

次に、 Python の __getattr__ in Javascript のような質問を見て、そのように答えることができます。

次のような質問も参照してください。

于 2012-04-19T10:27:13.767 に答える