在上一篇文章JavaScript – 说说代码重用(1)里面我简单的说了一下为何要重用JS代码以及JS代码重用的问题和解决方法,但是我上面也说了,上面那个解决方法是否能完全重用,我保留态度,这里我可以说,其实这个方法并不能完全解决代码相同的覆盖以及重用带来的问题,为什么,因为我们的程序总有一个入口点,这个入口点就是上面一篇文章里面的function onClick(),但是你有没有想过,function onClick()这个方法也可能出现两次呢?我们可以看看下面的代码。
<script src=”test2.js” type=”text/javascript”></script>
<script type=”text/javascript”>
function onClick()
{
var tester = new Test(1);
tester.onLoad();
}
</script>
<script type=”text/javascript”>
function onClick()
{
var tester = new Test(2);
tester.onLoad();
}
</script>
<div id=”toplogo” onclick=”onClick()”>
Click me
</div>
上面的代码你会说,噢,我不会这么使用,我相信在做Web开发的时候,这种情况很难遇到,但是这里有几种情况会这样使用到。
- 一个程序要加载两个一样的或类似的HTML(其中包含js)。
- 一个程序寄宿于一个JavaScript引擎,如Firefox和Firefox扩展。
- 一个程序调用其他程序或插件中的JS。
上面的三种情况,当你只写一个程序的时候,是没有问题的,比如我这里只写一个onClick方法,OK,没问题,但是如果有了两个的话(因为我们常常要在一个程序里面调用另一个程序,而另一个场景是,在类似做Firefox插件开发的时候,我们常常需要重用代码,例如我做一个google搜索工具栏,希望只改变一点东西就做成baidu搜索工具栏,但是js的覆盖特性往往会让后面的js覆盖掉前面的,导致两个程序不能同时运行),就会出现问题。而且随着Web应用的越来越多,我们对JavaScript的重用率也有越来越高的需求。
比如这里我又两个程序,都是寄宿于JavaScript引擎的,Firefox扩展就是一个最好的例子。
- Google工具栏:搜索功能,调用search js。本身有一个Main方法。
- Baidu工具栏:搜索功能,调用search js。本身也有一个Main方法。
这样,这里我们就可以看到有很多重复的了,因为本身的Main方法就重复并且覆盖了,当使用Google工具栏的时候,调用的JS其实是Baidu工具栏的。所以,这个地方我们就需要使用JavaScript里面的哈希表来去掉冲突,保留可重用的代码。
if(typeof(hash)==“undefined“)
{
var hash = new Array();
}
//main loader
function loader()
{
try
{
hash['{appname}obj'] = new Test(“{appname}“);
}
catch(e)
{
alert(“Hash table Exception Error: “ + e);
}
}
上面我写了一段代码,可以放到Script标签里面,也可以写到js文件中,其中我们首先先看hash存不存在,如果存在的话就不做任何事情,否则就创建一个hash,创建之后,我们把当前的应用程序的唯一标识作为hash的key并且创建新的对象保存到这个key里面。如果再有新的对象,我们也同样保存到这个hash里面,不过是另一个key。
比如这里我们要做google和baidu的工具条,我们只需要在两个程序中将{appname}改成google和baidu,这样在loader加载的时候,我们创建了google的对象并存在hash表里面,然后再创建了baidu的对象同样存在hash表里面。这样对象与对象之间就不会覆盖。当我们要执行相应的方法的时候,我们可以直接取hash表里面的对象,例如这里我们可以直接使用hash['googleobj'].Dosomething来执行方法。
这样,虽然我们的代码还是被覆盖了,但是覆盖的影响完全消除了,当我们要重用入口点的时候,也可以通过hash表来获取我们的对象,这样在入口点的部分也解决了代码重用的问题,防止了入口点的代码覆盖现象。
[...] Firefox Add-on – 说说代码重用(2) [...]