我想知道是否有办法,例如:
var klass = {
getName : function () { return "myname"; }
}
并做klass.getName();
实际调用getName之前有一个方法fire?在Groovy中,如果添加了 invoke 方法,则可以监听所有方法调用:
var klass = {
invoke function() { console.log("fires before getName()") ; },
getName : function () { return "myname"; }
}
我知道这是一个很长的镜头,但值得一试。
对改变实际调用方法的方式不感兴趣: klass.getName()
答案 0 :(得分:2)
显而易见的答案是,只需在invoke
方法中调用getName
即可。无论出于何种原因,如果您不想这样做,您可以事后代理klass
的方法:
// loop through all properties of klass
for (var i in klass) {
// skip if it's not a custom property, not a function or the invoke function
// (to prevent infinite nested calls)
if(!klass.hasOwnProperty(i) || typeof klass[i] !== 'function'
|| i === 'invoke') {
continue;
}
// add the invoke() method as a proxy to the current method
var old = klass[i];
klass[i] = function () {
klass.invoke.apply(this, arguments);
return old.apply(this, arguments);
};
}
你也可以整齐地把所有东西放在一起:
var klass = (function () {
this.invoke = function () {
console.log('called invoke()');
};
this.getName = function () {
return "called getName()";
};
(function (_this) {
for (var i in _this) {
if (!_this.hasOwnProperty(i) || typeof _this[i] !== 'function'
|| i === 'invoke') {
continue;
}
var old = _this[i];
_this[i] = function () {
_this.invoke.apply(_this, arguments);
return old.apply(_this, arguments);
};
}
})(this);
return this;
})();
console.log(klass.getName());