我遇到了一个问题,如果我可以在调用JS类中的任何方法之前强制运行一些js函数,那么这个问题只能解决。 例如:
var aClass = function() {
function myFunc() {
//do something
}
return {
method1: function() { //do something AFTER calling myFunc
}
method2: function() {
//do something AFTER calling myFunc
}
}
}
我有什么方法可以注射' myFunc同时放入method1和method2,所以在这些方法中的任何东西都可以被执行之前它会被调用吗?
非常感谢你的帮助。
答案 0 :(得分:0)
如果您的目标是避免重复自己,可以创建一个名为call
的方法,您可以传递方法的名称,并在调用给定方法之前调用myFunc
:
var aClass = function () {};
aClass.prototype.method1 = function () {
console.log("Called method1");
};
aClass.prototype.call = function (method) {
if (typeof this[method] === 'undefined') {
throw new Error("Unknown method on aClass");
}
this._myFunc();
this[method]();
};
aClass.prototype._myFunc = function () {
console.log("Called myFunc");
};
new aClass().call('method1');
// Outputs:
// Called myFunc
// Called method1
小提琴:http://jsfiddle.net/se9Ya/5/
注意,通过将方法添加到prototype
而不是实际对象本身,aClass
的所有未来'实例'将共享相同的函数,这样可以避免在内存中复制函数对象。
如果你想动态绑定任意数量的函数,另一种也许更好的方法就是这样:
function bindPreMethodToClassMethods(klass, fn){
var i, originalFn;
for(i in klass.prototype){
if(typeof klass.prototype[i] === 'function'){
originalFn = klass.prototype[i];
klass.prototype[i] = function() {
fn();
originalFn();
}
}
}
}
var aClass = function () {};
aClass.prototype.method1 = function () {
console.log("Called method1");
};
bindPreMethodToClassMethods(aClass, function(){
console.log("Called myFunc");
});
bindPreMethodToClassMethods(aClass, function(){
console.log("Called myOtherFunc");
});
new aClass().method1();
// Outputs:
// Called myOtherFunc
// Called myFunc
// Called method1
小提琴:http://jsfiddle.net/gX2FN/1/
我觉得第二种方法更好,因为语义更清晰,你仍然可以正常调用method1
方法。