如何将一个对象的使用映射到路由到 2 个对象?
How can I map one object usage to route to 2 objects?
我使用 totango 进行一些使用跟踪。现在,在我们尝试重新设计跟踪方式的同时,我想将跟踪发送到 2 个不同的 totango 帐户,以供过渡期使用。
我已经成功地将对象拆分为 window.totango_old
和 window.totango_beta
。
现在,我想知道我是否可以让 window.totango 简单地将我使用的任意方法应用到上面指定的 2 个不同对象上,而不是替换 window.totango
的所有旧用法。
我已经尝试弄清楚 .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
你可以使用这样的东西:
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 进行一些使用跟踪。现在,在我们尝试重新设计跟踪方式的同时,我想将跟踪发送到 2 个不同的 totango 帐户,以供过渡期使用。
我已经成功地将对象拆分为 window.totango_old
和 window.totango_beta
。
现在,我想知道我是否可以让 window.totango 简单地将我使用的任意方法应用到上面指定的 2 个不同对象上,而不是替换 window.totango
的所有旧用法。
我已经尝试弄清楚 .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
你可以使用这样的东西:
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