2012-09-20 18 views
2

调用对象的方法时,是否可以从JavaScript中获取通知?在调用javascript对象时获取通知

实施例:

o.foo(arg1); 

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

在上述例子中,o为对象,我想o_ongenericcall当任何方法试图调用被升高。

回答

0

我不认为它可以在本地完成。您可能想要实现Observer Pattern

0

不,这只有在您从foo方法中调用o_ongenericcall时才有可能。

但是,您可以轻松地装点的所有方法与调用对象上:

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" 
0

这可能不会帮助你多少,但你需要的是一个Proxy。这是一个相当新的和不稳定的JavaScript API,尚未成为任何标准的一部分,并没有真正被任何浏览器支持。 V8支持代理,但不会向Chrome公开该功能;然而,您可以通过--harmony-proxies参数执行enable them in Node.js

+0

我虽然这样,但不会代理只能记录访问的属性,而不是执行功能?至少,缺少装饰步骤(请参阅我的或dbaseman的答案)。 – Bergi

+0

@Bergi你可以实现一个'get'陷阱,将可调用属性包装成一个调用所需处理函数的附加函数。明显装饰的优点是,你不必明确地做。缺点是依赖代理:) – lanzz

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); 
    } 
} 

DEMO

+0

感谢您的示例,但这只适用于具有实际成员连接到它的对象。这是我正在使用的一种“假”对象。这与动态关键字在C#中的工作方式类似。看来,我正在寻找的东西是不可能的。 – vbguyny