Javascript,groovy就像调用方法一样?

时间:2013-08-25 12:33:11

标签: javascript groovy

我想知道是否有办法,例如:

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()

1 个答案:

答案 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());