Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将一个对象的使用映射到路由到两个对象?_Javascript_Call - Fatal编程技术网

Javascript 如何将一个对象的使用映射到路由到两个对象?

Javascript 如何将一个对象的使用映射到路由到两个对象?,javascript,call,Javascript,Call,我使用totango进行一些使用情况跟踪。现在,在我们尝试重新设计跟踪方式的同时,我想将跟踪发送到两个不同的totango帐户,作为过渡期 我已成功地将对象拆分为window.totango\u old和window.totango\u beta 现在,我不想取代window.totango的所有旧用法,而是想知道是否可以将window.totango上使用的任意方法应用到上面指定的两个不同对象上 我已经尝试了使用.apply(),但是我不能完全理解它在我的情况下是如何工作的 我想避免这样做:

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

我已成功地将对象拆分为
window.totango\u old
window.totango\u beta

现在,我不想取代
window.totango
的所有旧用法,而是想知道是否可以将window.totango上使用的任意方法应用到上面指定的两个不同对象上

我已经尝试了使用
.apply()
,但是我不能完全理解它在我的情况下是如何工作的

我想避免这样做:

window.totango = function() {
    return {
        track: function(event, value) {
            window.totango_old.track(event, value);
            window.totango_beta.track(event, value);
        }
    }
}
因为这意味着我必须一个接一个地映射可用的函数。是否有一种“一网打尽”的方法可以传递我对一个对象调用的任何方法,并让我获取它的名称和参数,从而动态地传递给不同的对象

我试着运行一个测试,如下所示:

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

您可以使用以下内容:

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的第一个参数是该上下文中“this”的值。根据模块的设置方式,重要的是在第一个参数中有正确的值。传递给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( )

您在尝试包装
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

现在它们被这样调用:
totango.track('event','value')
,我假设我必须将其修改为
totango('track','event','value')
,此方法才能工作?谢谢:)看起来我仍然需要填写可用函数的名称,但这比我原来的解决方案要好。@ChenAsraf IMHO,如果你只有两种方法,那就太复杂了。它还更改了返回值(尽管这可能无关紧要)@Alnitak,您可能是对的,但是您也可以轻松地将快捷方式方法添加到该方法中。再见,谢谢你们。我刚刚添加了不带参数的filler方法,并传递了
arguments
变量,我只是希望发现一个未来证明的方法:)我只希望有一个与PHP的
u call()等价的JS(
;)您实际需要包装多少个totango方法?这可能会很乏味,但目前它可能是最好的解决方案。只有2个,以后会减少到1个,但我有很多事件要更新,所以我宁愿避免更改调用函数进行跟踪的方式来修复原始测试,我认为您只需要立即调用该匿名函数,即
window.totango=(function(){return{…}}();
。目前的问题是
window.totango
只是一个尚未调用且没有属性的函数。