1

メッセージに応答するオブジェクトを作成する方法はありますか? 次のオブジェクトがあるとします。

function Dog();
Dog.prototype.speak(){
   alert("woof woof");
}
var myDog = new Dog();

そうするとmyDog.speak()、 でアラートが表示され"Woof woof"ます。しかし、私が望むのは、myDog.jump()(クラスで定義されていない) を呼び出すと、「存在しないメソッドを実行しようとしています」という警告をユーザーに表示するなどのデフォルトのアクションが得られることです。

どうすればできるか知っていますか?

4

3 に答える 3

3

Short answer: you can't.

Long answer: you could use __noSuchMethod__ but it's not standard and there are some plans to remove it, because Proxy can do the same, and more. Plus, it's a standard. Therefore, you could use a Proxy to do that, but I would discourage to have all objects as proxies, because performance reasons.

Personally, I would just leave the language thrown it's own exception, that the developer can check in the error console.

于 2013-10-23T14:44:40.000 に答える
1

これを行う標準ベースの方法はありません。一番近いのはこれです。

これに最も近いのは次のとおりです。

function execute(obj, message, args) {
    if (obj[message] && typeof(message) === function) {
        obj[message].call(obj, args);
    } else {
       obj[message] = function() {
           //missing method functionality a la Ruby here
       };
    }
}
于 2013-10-23T14:38:46.370 に答える
0

他の人はすでに__noSuchMethod__Proxyについて言及しているので、それらについての詳細は控えます。

代わりに、あなたが望むことができるかもしれない別のテクニックを強調したかった. これは醜いハックであることに注意してください。使用を推奨することはできません。また、すべてのターゲットで機能するとは限りません。これらの警告を念頭に置いて、window.onerrorを提示します。

window.onerror = function(err) {
  if (/has no method/.test(err)) {
    console.log('oh my: ' + err) // This is where you'd call your callback
    return true
  }

  return false
}


;(function() {
  this.foo() // will be caught by window.onerror
})()

これは、少なくとも私の非常に限られたテストでは、メソッドが見つからなかったことを示す TypeErrors (少なくとも Chrome では、マイレージは異なる場合があります) をキャッチします。これを行うべきではない理由のいくつかを次に示します。

  • window.onerrorハンドラーは 1 つしか持てません。ハンドラーが上書きされている場合、これは機能しません
  • 特定のオブジェクトだけでなく、グローバルに TypeErrors をキャッチします。つまり、多くの誤検知
  • このハンドラーがどこにあるのかわからない人のために、デバッグするのが楽しくなります。
  • この動作に依存するコードのビットを密結合します (悪い、悪い、悪い!)。

これをハッキングすることを本当に考えるべきではないことを十分に強調することはできないと思います.可能であればプロキシを使用し、不可能であれば敗北を認めてください.

于 2013-10-23T17:22:44.600 に答える