如何将一个对象用法映射到2个对象?

时间:2015-01-06 08:46:46

标签: javascript call

我使用totango进行一些使用情况跟踪。现在,当我们尝试重新设计跟踪的方式时,我想将跟踪发送到2个不同的totango帐户,过渡期。

我设法将对象拆分为window.totango_oldwindow.totango_beta

现在不是替换window.totango的所有旧用法,而是想知道我是否可以创建window.totango只需将我使用的任意方法应用到上面指定的2个不同对象上。

我已经尝试用.apply()来确定用法,但我无法完全掌握它在我的情况下是如何工作的。

我想避免这样做:

window.totango = function() {
    return {
        track: function(event, value) {
            window.totango_old.track(event, value);
            window.totango_beta.track(event, value);
        }
    }
}

因为这意味着我必须逐个映射可用的功能。是否有一个" catch-all"我会调用一个对象的方法,让我得到它的名字和参数,以动态传递给不同的对象的方式?

我尝试过运行测试,如下:

window.test2 = function() {
    return {
        testFunc: function(a, b) {
            console.log([a, b]);
        }
    }
};

window.test = function() {
    this.apply(window.test2, arguments)
    // also tried: window.test2.apply(window.test2, arguments)
};

window.test.testFunc("1", "2");

但我收到以下例外:

Uncaught TypeError: undefined is not a function

2 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

window.callFunction = function( method, args ) {
    var res = { };

    //Set the default values
    method = method || 'track';
    args = args || [ ]; 

    //in case we want the result of the functions
    res.old = window.totango_old[ method ].apply( window.totango_old, args );
    res.beta = window.totango_beta[ method ].apply( window.totango_beta, args );

    return res;
}

因为totango_old是一个对象,你可以使用方法的名称作为索引,然后在返回的函数上调用apply并传递你的参数。 apply的第一个参数是"这个"的值。在这种情况下。根据模块的设置方式,在第一个参数中输入正确的值非常重要。传递给apply的第二个参数是传递给函数的参数。

你可能会做这样的事情

function TotangoFill () {

}
TotangoFill.prototype = {
    callFunction: function ( method, args ) {
        var res = { };

        //Set the default values
        args = args || [ ]; 

        //in case we want the result of the functions
        res.old = window.totango_old[ method ].apply( window.totango_old, args );
        res.beta = window.totango_beta[ method ].apply( window.totango_beta, args );

        return res;
    },
    track: function( event, value ) {
        // arguments is an array of all the arguments passed to this function
        return this.callFunction( 'track', arguments );
    },
    anotherMethod: function( ) {
        //You don't need to define the parameters, just pass them on 
        return this.callFunction( 'anotherMethod', arguments );
    },
    customEvent: function( value ) {
        //Add another layer of abstraction
        return this.track( 'customEvent', value );
    }
}

window.totango = new TotangoFill( )

答案 1 :(得分:0)

您尝试打包totango时遇到问题,这会解释测试中的错误,并且可以在不更改调用的情况下轻松解决。

具体来说,您需要实际调用分配给window.totango的函数,使totango包含返回的对象,而不是函数本身,即:

window.totango = (function() {
    return {
        track: function(event, value) {
            window.totango_old.track(event, value);
            return window.totango_beta.track(event, value);
        }
    }
})();  // invocation