我们经常会在写应用程序的时候写到JavaScript,作为一个专业的程序员,我们肯定是要重复利用代码,但是JS的重复利用代码会有很多很多的问题,我想可能各位都遇到过如此的问题,OK,为了能够更方便的理解这个问题,我们现在先重现这个问题。
我们先写两个js文件,分别为test和test2。OK,代码分别如下。
test
{
alert("test");
}
test2
{
alert("test2");
}
OK,我们写完了代码然后我们再写HTML,调用Dosomething这个方法。
<script src="test2.js" type="text/javascript"></script> <div id="toplogo" onclick="Dosomething()">
Click me
</div>
恩,我们运行一下,看到了结果是test2,当然,你会说这个肯定是会重复的,我们项目可以不这么写,当然,你是对的,但是不这样写的话叫代码重用吗?如果我有两个程序都是用同一个函数,而两个程序都会安装到载体(比如Firefox,或者HTML的调用),那么这个结果肯定不是我们想要达到的结果,因为这里代码内部的所有东西都会被覆盖,这样前面一个方法写了就等于没写,就算变量不同,也会出问题。OK,聪明的你肯定想到了用JavaScript的面向对象的特征,OK,我们重写一下。
test
Test.prototype
={
_number:0,
onLoad:function()
{
var i = 1;
alert(i);
}
}
test2
Test.prototype
={
_number:0,
onLoad:function()
{
var i = 2;
alert(i);
}
}
恩,我们看到上面的代码基本相同,除了i这个变量的值意外,OK,我们再来修改一下HTML试试是不是还会被覆盖。
<script src="test2.js" type="text/javascript"></script> <script type="text/javascript">
function onClick()
{
var tester = new Test();
tester.onLoad();
}
</script> <div id="toplogo" onclick="onClick()">
Click me
</div>
运行之后,还是test2的结果,也就是说还是被覆盖掉了,恩,这可不太好,为了解决这样的问题,我们需要讲一些变量保存到类里面去,从而声明一个新的对象。既然我们知道相同的名称的代码会覆盖,那么如果代码一模一样,覆盖了就覆盖了,没有影响,所以这个时候我们就需要将一些可能会覆盖的变量存储到对象中,我们更改下面的代码。
我们将test和test2都写成下面的代码。
if(!Test) var Test = function(number){this._number=number;};
Test.prototype
={
_number:0,
onLoad:function()
{
var i = this._number;
alert(i);
}
}
我们再改一下HTML里面的调用看看。
<script src="test2.js" type="text/javascript"></script> <script type="text/javascript">
function onClick()
{
var tester = new Test(1);
tester.onLoad();
var tester = new Test(3);
tester.onLoad();
}
</script> <div id="toplogo" onclick="onClick()">
Click me
</div>
运行一下,恩,是我们期望的结果了。也就是说这样就正确了,我们必须初始化一个单一(有一个构造函数并且参数一样)的对象,而内部的属性都是和这个单一的变量有关联。到最后,两个重复的代码之间没有任何区别,这样就可以重用我们的代码。
不过这个地方是否真的解决了我们的问题,我还得保留一点观点,我会在下一篇文章中讲一下如何利用重复代码。
@DiamRem
OK,等下写一篇文章,不过我有一个项目做过这个,不过是搜索的,给你提供下载。。:)
http://www.jguoer.com/apps/firefox/MenuTest.xpi
看不懂了看不懂了,情何以堪啊……
我想做一个Firefox的插件,用来引用网页上文字到Twitter
就是选中某个网页上的某段文字 右键点击的话会有个quote to twitter的选项,然后直接可以把这段文字和这个网页的地址发到Twitter上
可是目前只有想法,不晓得怎么动手……
[...] Firefox Add-on – 说说代码重用(1) [...]