読み込んでいます...

我们经常会在写应用程序的时候写到JavaScript,作为一个专业的程序员,我们肯定是要重复利用代码,但是JS的重复利用代码会有很多很多的问题,我想可能各位都遇到过如此的问题,OK,为了能够更方便的理解这个问题,我们现在先重现这个问题。

我们先写两个js文件,分别为test和test2。OK,代码分别如下。

test

function Dosomething()
{
    alert(
"test");
}

test2

function Dosomething()
{
    alert(
"test2");
}

OK,我们写完了代码然后我们再写HTML,调用Dosomething这个方法。

<script src="test.js" type="text/javascript"></script>
<script src="test2.js" type="text/javascript"></script>

<div id="toplogo" onclick="Dosomething()">
Click me
</div>

恩,我们运行一下,看到了结果是test2,当然,你会说这个肯定是会重复的,我们项目可以不这么写,当然,你是对的,但是不这样写的话叫代码重用吗?如果我有两个程序都是用同一个函数,而两个程序都会安装到载体(比如Firefox,或者HTML的调用),那么这个结果肯定不是我们想要达到的结果,因为这里代码内部的所有东西都会被覆盖,这样前面一个方法写了就等于没写,就算变量不同,也会出问题。OK,聪明的你肯定想到了用JavaScript的面向对象的特征,OK,我们重写一下。 

test

if(!Test) var Test = function(){};

Test.prototype =
{
    _number:
0,
    onLoad:
function()
    {
        
var i = 1;
        alert(i);
    }
}

test2

if(!Test) var Test = function(){};

Test.prototype =
{
    _number:
0,
    onLoad:
function()
    {
        
var i = 2;
        alert(i);
    }
}

恩,我们看到上面的代码基本相同,除了i这个变量的值意外,OK,我们再来修改一下HTML试试是不是还会被覆盖。

<script src="test.js" type="text/javascript"></script>
<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="test.js" type="text/javascript"></script>
<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>

运行一下,恩,是我们期望的结果了。也就是说这样就正确了,我们必须初始化一个单一(有一个构造函数并且参数一样)的对象,而内部的属性都是和这个单一的变量有关联。到最后,两个重复的代码之间没有任何区别,这样就可以重用我们的代码。

不过这个地方是否真的解决了我们的问题,我还得保留一点观点,我会在下一篇文章中讲一下如何利用重复代码。

  1. 诡异的西红柿 @

    @DiamRem
    OK,等下写一篇文章,不过我有一个项目做过这个,不过是搜索的,给你提供下载。。:)
    http://www.jguoer.com/apps/firefox/MenuTest.xpi

  2. DiamRem @

    看不懂了看不懂了,情何以堪啊……

    我想做一个Firefox的插件,用来引用网页上文字到Twitter

    就是选中某个网页上的某段文字 右键点击的话会有个quote to twitter的选项,然后直接可以把这段文字和这个网页的地址发到Twitter上

    可是目前只有想法,不晓得怎么动手……

  3. 置顶的更新,文章汇总 : GuoJing's Blog | 用心对待每一行代码 @

    [...] Firefox Add-on – 说说代码重用(1) [...]

:-D :-? 8) :cry: 8-O :lol: :-x :-| :?: :-P :oops: :roll: :( :) :-o :wink: more »