调用对象的方法时是否可以从 JavaScript 中获取通知?
例子:
o.foo(arg1);
function o_ongenericcall(name, arguements)
{
switch (name)
{
case "foo":
// Do something
break;
}
}
在上面的示例中, o 是对象,我希望在尝试调用任何方法时引发 o_ongenericcall。
调用对象的方法时是否可以从 JavaScript 中获取通知?
例子:
o.foo(arg1);
function o_ongenericcall(name, arguements)
{
switch (name)
{
case "foo":
// Do something
break;
}
}
在上面的示例中, o 是对象,我希望在尝试调用任何方法时引发 o_ongenericcall。
您可以在对象的函数调用上创建一种代理。
// 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);
}
}
我不认为它可以在本地完成。
您可能想要实现观察者模式。
这可能对您没有多大帮助,但您需要的是Proxy。这是 Javascript 中一个相当新且不稳定的 API,尚未成为任何标准的一部分,并且不受任何浏览器的真正支持。V8 支持代理,但不向 Chrome 公开该功能;但是,您可以通过使用参数在 Node.js 中启用它们。--harmony-proxies
检查 AOP (Aspect Oriented Programming: Wikipedia ) 然后检查这个:AOP from Stackoverflow
不,这只有在您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"