2

オブジェクトのメソッドを呼び出すときに、JavaScript 内から通知を受け取ることはできますか?

例:

o.foo(arg1);

function o_ongenericcall(name, arguements)
{
 switch (name)
 {
  case "foo":
   // Do something 
   break;
 }
}

上記の例では、o がオブジェクトであり、メソッドが呼び出されようとしているときに o_ongenericcall を発生させたいと考えています。

4

5 に答える 5

1

オブジェクトの関数呼び出しで一種のプロキシを作成できます。

// create a copy of the original function
o.foo_ = o.foo;

// replace the original function with a wrapper that calls the notification
o.foo = function() { 
    console.log("notify: foo(" + arguments[0] ")"); 
    o_ongenericcall("foo", arguments);
    this.foo_.apply(this, arguments); 
}

o.foo("testing");

通知: foo(テスト中)

オブジェクトのプロパティをループすることで、これを設定できることに注意してください。

for (var member in o) {
   if (typeof o[member]=="function") {
      console.log(member);
      applyNotificationProxy(o, member);
   }
}

デモ

于 2012-09-20T19:20:41.087 に答える
0

AOP (Aspect Oriented Programming: Wikipedia ) を確認してから、これを確認してください: AOP from Stackoverflow

于 2012-09-20T19:24:11.617 に答える
0

ネイティブにはできないと思います。

おそらくObserver Patternを実装したいと思うでしょう。

于 2012-09-20T19:12:43.163 に答える
0

o_ongenericcallいいえ、これはメソッドから呼び出した場合にのみ可能ですfoo

ただし、その呼び出しでオブジェクトのすべてのメソッドを簡単にデコレートできます。

function decorated(obj) {
    var res = {}; // you might also use obj itself if you don't want to create a new one
    for (var p in obj) 
        if (typeof obj[p] == "function")
            (function(orig, p) {
                res[p] = function() {
                     o_ongenericcall(p);
                     return orig.apply(this, arguments);
                };
            })(obj[p], p);
        else
            res[p] = obj[p];
}

obj = decorated({foo:function(){console.log("foo");}});
obj.foo(); // calls o_ongenericcall, then logs "foo"
于 2012-09-20T19:13:37.320 に答える
0

これはおそらくあまり役​​に立ちませんが、必要なのはProxyです。これは Javascript のかなり新しく不安定な API であり、まだどの標準にも含まれておらず、実際にはどのブラウザーでもサポートされていません。V8 はプロキシをサポートしていますが、その機能を Chrome に公開していません。ただし、パラメーターを指定して実行することにより、Node.js で有効にする--harmony-proxiesことができます。

于 2012-09-20T19:17:48.593 に答える