JavaScript相同的函数,不同的实现决定于runtme

问题描述:

在运行时更改JavaScript实现的最佳方式是什么?JavaScript相同的函数,不同的实现决定于runtme

我有一个web应用程序,它通过SignalR连接到服务器。
如果在运行时使用SignalR连接到服务器时有任何问题,我想更改服务功能实现以使用常规XHR。

我有以下功能一个js文件通过SignalR连接:通过XHR

function initializeConnection() { 
    // Initialize connection using SignalR 
} 

function sendEcho() { 
    // Sending echo message using signalR 
} 

而另一JS与连接相同功能的文件:

function initializeConnection() { 
    // Initialize connection using XHR 
} 

function sendEcho() { 
    // Sending echo message using XHR 
} 

我知道不可能让他们在同一时间加载。
我知道我可以在每个函数中使用一个带有切换的文件。

我想也许我可以在这些文件之间切换加载&在运行时卸载它们。这可能吗?如果是这样,这是解决这个问题的最好方法吗?

什么是在运行时提供不同实现的最佳方式?

+2

'var func = {success:{//其他功能},失败:{//其他功能}}'如果成功,请使用'func.success' else'func.fail' .. – Rayon

+0

是的,可以使用命名空间。 – Lain

+0

您可以在运行时包含这两个选项,并轻松定义要使用哪一个,但您如何确定该选择?我可以给你一个简单的例子,但没有逻辑来决定使用哪一个,所以你无法做你所要求的。 – Archer

一种方式做到这一点,是定义两个实现与相同签名的对象和刚刚成立的命名空间的变量:

;var MyStuff = { 
    //SignalR 
    SignalR: { 
     initializeConnection: function(){console.log('SignalR.initializeConnection()')}, 
     sendEcho: function(){console.log('SignalR.sendEcho()')} 
    }, 

    //XHR 
    XHR: { 
     initializeConnection: function(){console.log('XHR.initializeConnection()')}, 
     sendEcho: function(){console.log('XHR.sendEcho()')} 
    } 
}; 

//Do whatever check you want to 
var mNamespace = (1 === 2) ? MyStuff.SignalR : MyStuff.XHR; 

//Call the instance 
mNamespace.initializeConnection(); 

您也可以将它们分割在两个文件并把它们添加到MyStuff动态地:

//File 1 
;var MyStuff = (MyStuff === undefined) ? {} : MyStuff; 
MyStuff.SignalR = {..}; 

//File 2 
;var MyStuff = (MyStuff === undefined) ? {} : MyStuff; 
MyStuff.XHR = {..}; 

可以帮助你的一种模式是“懒惰函数定义”或“自定义函数”模式。它由(正如其名称所指出的)在运行时重新定义一个函数。当你的功能需要做一些初步的准备工作,而且它只需要做一次就很有用。

在你的情况下,这个“准备工作”将选择处理客户端 - 服务器连接的函数。

例如:

var addHandler = document.body.addEventListener ? 
 
    function(target, eventType, handler) { 
 
    target.addEventListener(eventType, handler, false); 
 
    } : 
 
    function(target, eventType, handler) { 
 
    target.attachEvent("on" + eventType, handler); 
 
    };

var sendMessage = function() { 
 
    // Perform a check, or try a first message using your default connection flavour 
 
    // Depending on the result, redefine the function accordingly 
 
    sendMessage = sendMessageUsingWhatever; 
 
}; 
 

 
//Use sendMessage anywhere you want, it'll use the proper protocol

与浏览器和他们的特点时,这模式是特别方便

在这种情况下,根据特定方法的可用性(或不确定)确定附加事件侦听器的方式是很有用的。

虽然它有其缺点。例如,以前添加到原始函数的任何属性在重新定义自身时都会丢失。

希望它有助于或至少给你一些想法。