调用对象的方法时,是否可以从JavaScript中获取通知?在调用javascript对象时获取通知
实施例:
o.foo(arg1);
function o_ongenericcall(name, arguements)
{
switch (name)
{
case "foo":
// Do something
break;
}
}
在上述例子中,o为对象,我想o_ongenericcall当任何方法试图调用被升高。
调用对象的方法时,是否可以从JavaScript中获取通知?在调用javascript对象时获取通知
实施例:
o.foo(arg1);
function o_ongenericcall(name, arguements)
{
switch (name)
{
case "foo":
// Do something
break;
}
}
在上述例子中,o为对象,我想o_ongenericcall当任何方法试图调用被升高。
我不认为它可以在本地完成。您可能想要实现Observer Pattern。
不,这只有在您从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"
这可能不会帮助你多少,但你需要的是一个Proxy。这是一个相当新的和不稳定的JavaScript API,尚未成为任何标准的一部分,并没有真正被任何浏览器支持。 V8支持代理,但不会向Chrome公开该功能;然而,您可以通过--harmony-proxies
参数执行enable them in Node.js。
您可以在对象的函数调用上创建一种代理。
// 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);
}
}
感谢您的示例,但这只适用于具有实际成员连接到它的对象。这是我正在使用的一种“假”对象。这与动态关键字在C#中的工作方式类似。看来,我正在寻找的东西是不可能的。 – vbguyny
检查AOP(面向方面编程:Wikipedia),然后检查:AOP from Stackoverflow
我虽然这样,但不会代理只能记录访问的属性,而不是执行功能?至少,缺少装饰步骤(请参阅我的或dbaseman的答案)。 – Bergi
@Bergi你可以实现一个'get'陷阱,将可调用属性包装成一个调用所需处理函数的附加函数。明显装饰的优点是,你不必明确地做。缺点是依赖代理:) – lanzz