前些天写了一篇关于JavaScript基础的帖子"JavaScript基础之对象"。在那篇帖子中说马上就会写一些关于继承方面的东西。可是上周杂事太多,都没有时间动笔,就一直拖到今天才终于下笔写了。上一篇帖子中很多人认为我自己的东西太少了,所以这篇帖子中在说完基础知识之后我会给出一个完整的例子。     大家都知道面向对象语言的三大特性为:封装、继承、多态。面向对象的语言之所以强大就全依赖于这三大特性。脚本作为一种准面向对象的语言虽然有先天的不足,但还是能在某种程度上去实现这些特性。实现最多、技术最成熟的就数继承了,不过脚本也不能像C#一样简单地用一个":"就能实现继承,而是要自己去实现继承的细节。 $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
1 继承的几种实现方法 $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
    要实现继承首先就必须要有子类、父类(超类、基类等叫法)。子类去继承父类的方法和属性。在脚本里所有开发人员定义的类都可以作为父类,不过本地类(native object)和宿主类(host object)不能作为父类。由于脚本里面没有访问修饰符,父类所有的属性和方法都可以被子类直接访问。子类也可以扩展父类的属性和方法。 $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
1.1 call()方法 $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
    Call方法是脚本的一个内置(build in)方法。官方说明为:调用一个对象的方法,以另一个对象替换当前对象。语法为:call([thisObj[,arg1[, arg2[, [,.argN]]]]])。用这个方法可以很容易地模拟继承的实现: $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
1function funCreateElement(sClassName)$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
2        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
3            this.sAClassName=sClassName;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
4            $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
5            this.createALink=function()$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
6            {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
7                var oA=document.createElement("a");$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
8                oA.className=this.sAClassName;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
9                return oA;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
10            }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
11        }
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
    类(funCreateElement)有一个属性(sAClassName)和一个方法(createALink)。它的作用是创建一个DOM元素。这个类使用this关键字给属性赋值,这样就确保了所有的实例指向的都是自己的值。$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
1function funCurrNavi()$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
2        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
3            // 继承元素创建类$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
4            funCreateElement.call(this,"tblNavigatorA");$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
5        }
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
    这样就实现了一个最简单的继承了。在funCurrNavi的实例里就可以直接使用funCreateElement类里面的方法了。 $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
    var o=new funCurrNavi(); $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
   
o.createALink(); $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
1.2 apply()方法
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
    apply方法也是脚本的一个内置(build in)方法。其用法和call对象类似。官方说明为:应用某一对象的一个方法,用另一个对象替换当前对象。语法为:apply([thisObj[,argArray]])。实际上这两个的作用几乎是相同的,要注意的地方是call(thisObj[,arg1[, arg2[,)中的arg参数可以是变量,而apply([thisObj[,argArray]])中的参数为数组集合。由于和call方法就只有参数的不同而已所以就不举例子了。 $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
1.3 原型链
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
  Prototype对象是所有类的源头。如果修改了prototype类的方法则这个修改会反映到所有类的实例里面。比如:在string.prototype里面加一个方法trim(),String.prototype.trim=function(){}。那么所有的字符串都会具有trim()方法了("aa".trim())。由于prototype的这个特性,我们就可以实现继承方法了。如果用原型链的方式重定义前面的例子,它们将变为下面的形式: $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
1function funCreateElement()$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
2        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
3        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
4        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
5        funCreateElement.prototype.sAClassName=sClassName;  // 样式类$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
6        funCreateElement.prototype.createALink=function()$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
7        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
8            var oA=document.createElement("a");$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
9            oA.className=this.sAClassName;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
10            return oA;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
11        }  $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
12        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
13        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
14        function funCurrNavi()$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
15        { $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
16        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
17        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
18        funCurrNavi.prototype=new funCreateElement();$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
19        funCurrNavi.prototype.showMeInDiv=function()$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
20        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
21        }
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
    这种方式采用funCurrNavi.prototype=new funCreateElement()方法,将funCreateElement类里面所有的属性和方法都复制到funCurrNavi类里面。非常的快捷。这种方式虽然非常的快捷,但是也有其缺点。采用这种方式时子类所有的属性和方法都必须在funCurrNavi.prototype=new funCreateElement()语句之后。因为该语句会覆盖funCurrNavi类原有的prototype类,添加了新的属性和方法的原有prototype类将被销毁。而且父类和子类都没有参数,只能通过设置属性的方法传入参数。
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
1.4 混合方式
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
    混合方式就是指将前两种方式结合起来使用,取长避短。在call方式里面定义类的方式不理想,相同的方法在实例里面被重复的实例化了。原型链的方法则因为没有参数而不理想,使用参数前得额外的去设置其属性,不如构造函数的参数来的方便。根据上一篇帖子中定义类的混合方式,我们重新定义funCreateElement类:$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
1function funCreateElement(sClassName)$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
2        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
3            this.sAClassName=sClassName;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
4        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
5        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
6        funCreateElement.prototype.createALink=function()$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
7        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
8            var oA=document.createElement("a");$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
9            oA.className=this.sAClassName;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
10            return oA;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
11        }
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
然后在funCurrNavi类里面采用call方式继承funCreateElement类的属性,采用原型链的方式继承其方法。如下:
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
1function funCurrNavi(sLinkText)$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
2        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
3            funCreateElement.call(this,"tblNavigatorA");$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
4        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
5            this.LinkText=sLinkText;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
6        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
7        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
8        funCurrNavi.prototype=new funCreateElement();  // 继承超链接类$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
9        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
10        funCurrNavi.prototype.showMeInDiv=function()$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
11        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
12            var oLink=this.createALink();$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
13            oLink.text=this.LinkText;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
14        }
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
    采用funCreateElement.call(this,"tblNavigatorA")方式继承其参数,funCurrNavi.prototype=new funCreateElement()方式继承其方法。从而达到方法不会被实例化多次的目的。 $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
2 实例 $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
    前面讲述了几种继承的实现方式,这一小节就利用前面讲述的方法去练习一个小例子。这个例子是根据一个字符串去呈现一个树状的列表,这种需求常见于页面的导航中。由于只是为了辅助讲述继承,例子有些地方不免有些牵强附会和小题大做的地方。这些就希望各位网友包涵了,请各位珍惜自己的砖头了。我在这里戴上钢盔等候大家的批评了。:) $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
    下面是其运行成功的样图:$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
    左面的那个是用table作为容器,右边的那个是用div作为容器。$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
  1<html xmlns="http://www.w3.org/1999/xhtml">$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
  2<head>$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
  3    <title>Create Admin Pages' Navigator</title>$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
  4$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
<style type="text/css">$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
  5        /**//*导航table的样式*/.tblNavigator$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
  6        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
  7            border: 2px solid #FFD7AC;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
  8            width: 200px;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
  9            margin: 3px;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
10            background: #fff;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
11            margin-top: 5px;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
12            margin-bottom: 5px;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
13            border-collapse: collapse;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
14        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
15        /**//*每个根节点的样式*/.tblNavigatorRoot$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
16        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
17            height: 30px;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
18            line-height: 30px;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
19            text-align: left;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
20            vertical-align: middle;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
21        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
22        /**//*根节点的子节点的样式*/.tblNavigatorTD$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
23        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
24            border-collapse: collapse;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
25            border: 1px solid #FFE6CB;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
26            height: 22px;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
27            text-indent: 15px;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
28            background: #fff;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
29            width: 100%;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
30        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
31        /**//*导航中的超链接*/.tblNavigatorA$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
32        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
33            font-weight: 700;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
34            text-decoration: none;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
35            color: Black;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
36            width: 100px;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
37        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
38    </style>$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
39</head>$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
40<body>$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
41    <div id="divMain">$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
42    </div>$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
43    <div id="divMain2"$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
class="tblNavigator">$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
44    </div>$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
45$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
46    <script type="text/javascript">$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
47        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
48        var sNavigatorMain = $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
49        { $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
50            sNavigators:[$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
51            {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
52                root:[{name:'root1'}],$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
53                sons:[{name:'root1Son1',url:'bcc'},{name:'root1Son2',url:'bcc'}]$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
54            },$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
55            {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
56                root:[{name:'root2'}],$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
57                sons:[{name:'root2Son1',url:'bcc'}]$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
58            },$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
59            {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
60                root:[{name:'root3'}],$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
61                sons:[{name:'root3Son1',url:'bcc'},{name:'root3Son2',url:'bcc'},{name:'root3Son3',url:'bcc'}]$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
62            },$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
63            {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
64                root:[{name:'root4'}],$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
65                sons:[{name:'root4Son1',url:'bcc'},{name:'root4Son3',url:'bcc'}]$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
66            }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
67            ,$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
68            {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
69                root:[{name:'root4'}],$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
70                sons:[{name:'root4Son1',url:'bcc'},{name:'root4Son3',url:'bcc'}]$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
71            }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
72            ]$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
73        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
74        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
75        /**//*$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
76        * 创建一个元素$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
77        * sClassName:元素的样式控制类$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
78        */$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
79        function funCreateElement(sClassName)$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
80        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
81            // 样式类$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
82$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
this.sAClassName=sClassName;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
83        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
84        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
85        /**//*$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
86        * 创建超链接元素$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
87        * sText:超链接显示的文本$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
88        * sUrl:超链接的href$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
89        * sTarget:打开链接的目标$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
90        * 返回:超链接元素$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
91        */$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
92        funCreateElement.prototype.createALink=function(sText,sUrl,sTarget)$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
93        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
94            var oA=document.createElement("a");$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
95            oA.href=sUrl;                      // 链接文本$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
96            oA.className=this.sAClassName;      // 样式类$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
97            oA.target=sTarget;            // 打开链接的目标$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
98            oA.appendChild(document.createTextNode(sText));    // 显示文本$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
99            $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
100            return oA;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
101        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
102        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
103        /**//*$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
104        * 创建Div元素$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
105        * sText:显示的文本$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
106        * 返回:Div元素$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
107        */$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
108        funCreateElement.prototype.createDivBlank=function()$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
109        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
110            var oDiv=document.createElement("div");$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
111            oDiv.className=this.sAClassName;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
112            return oDiv;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
113        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
114        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
115        /**//*$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
116        * 创建Div元素$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
117        * sText:显示的文本$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
118        * 返回:Div元素$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
119        */$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
120        funCreateElement.prototype.createDivNoLink=function(sText)$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
121        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
122            var oDiv=document.createElement("div");$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
123            oDiv.className=this.sAClassName;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
124            oDiv.appendChild(document.createTextNode(sText));$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
125            $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
126            return oDiv;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
127        }$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
128        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
129        /**//* $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
130        * 创建一个模块的节点$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
131        * oNaviJSON:一个模块节点的文本$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
132        * oParentObject:父节点$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
133        * sClassNameRoot:根节点的样式类$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
134        * sClassNameNode:子节点的样式类$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
135        */$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
136        function funCurrNavi(oNaviJSON,oParentObject,sClassNameRoot,sClassNameNode)$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
137        {$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
138            // 继承元素创建类$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
139            funCreateElement.call(this,"tblNavigatorA");$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
140        $©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
141            // 当前导航的菜单$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
142$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
this.oNavi=oNaviJSON;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
143            // 当前导航的父节点$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
144$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
this.oParent=oParentObject;$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
145            // 根节点的样式类$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
146$©=Çø‘ŠÇwww.netcsharp.cn5ÍÙëÜ\êOòf
this.oNClassNameRoot=sClassNameRoot;