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

我不认为它可以在本地完成。

您可能想要实现观察者模式

于 2012-09-20T19:12:43.163 回答
0

这可能对您没有多大帮助,但您需要的是Proxy。这是 Javascript 中一个相当新且不稳定的 API,尚未成为任何标准的一部分,并且不受任何浏览器的真正支持。V8 支持代理,但不向 Chrome 公开该功能;但是,您可以通过使用参数在 Node.js 中启用它们。--harmony-proxies

于 2012-09-20T19:17:48.593 回答
0

检查 AOP (Aspect Oriented Programming: Wikipedia ) 然后检查这个:AOP from Stackoverflow

于 2012-09-20T19:24:11.617 回答
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 回答