将preProcess添加到JS类中的所有方法

时间:2014-07-17 21:10:04

标签: javascript

我遇到了一个问题,如果我可以在调用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,所以在这些方法中的任何东西都可以被执行之前它会被调用吗?

非常感谢你的帮助。

1 个答案:

答案 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方法。