JavaScript的OO特性:继承

        继承无疑是JavaScript体现OO特性的最为重要的一环,不能实现继承的语言就不能称为面向对象语言.
        由于JavaScript是一门基于对象的语言,先天并不支持继承特性.这里使JavaScript具有继承的特点,是使用prototype关键字实现的.
        prototype是原型关键字,它是一个对象,是属于每一个JavaScript类型变量的子对象.设想一下,如果变量b的prototype是变量a,而a具有方法show,那么通过b.prototype.show就等价于a.show.当然,b.prototype.show这种写法相当不友好,值得庆幸的是,浏览器总算支持一种特殊的访问规则:如b.show调用时,如果b变量自己具有show方法,则直接调用b的show方法,如果没有,则调用b.prototypt.show,如果还没有,则调用b.prototype.prototype.show...依次类推,一直到最底层.(这种调用机制,是JavaScript实现继承的核心机制!)
        首先定义一个类,如下:
ExpandedBlockStart.gif ContractedBlock.gif      function  Employee(name,dept) dot.gif {
InBlock.gif        
this.name = name || "none";
InBlock.gif        
this.dept = dept || "general";
ExpandedSubBlockStart.gifContractedSubBlock.gif        
this.toString = function()dot.gif{
InBlock.gif            
return this.name + "&" + this.dept;
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

ExpandedBlockStart.gifContractedBlock.gif    Employee.show 
=   function (s) dot.gif {          //show是Employee类的静态方法,只能由类调用,不能由实例对象调用.
InBlock.gif
        alert(s);
ExpandedBlockEnd.gif    }
        这个类在前面几节有详细介绍.
        现在我们要从这个Employee类派生出一个子类WorkerBee,该怎么做呢?如下:
None.gif      // 由Employee类派生一个WorkerBee子类
ExpandedBlockStart.gifContractedBlock.gif
     function  WorkerBee(age,name,dept) dot.gif {        
InBlock.gif        
this.age = age || 0;
InBlock.gif        
this.name = name;
InBlock.gif        
this.dept = dept;
InBlock.gif        
ExpandedBlockEnd.gif    }

None.gif    WorkerBee.prototype 
=   new  Employee;
        关键还是在于WorkerBee.prototype  =   new  Employee;这行代码实现了继承.(就是prototype成为Employee实例.
        如下是全部的示例代码:
E
None.gif < script type = " text/javascript " >
None.gif    
// 创建一个类Employee作为基类
None.gif
     // var Employee = function(name,dept){dot.gif}   //or
ExpandedBlockStart.gifContractedBlock.gif
     function  Employee(name,dept) dot.gif {
InBlock.gif        
this.name = name || "none";
InBlock.gif        
this.dept = dept || "general";
ExpandedSubBlockStart.gifContractedSubBlock.gif        
this.toString = function()dot.gif{
InBlock.gif            
return this.name + "&" + this.dept;
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

ExpandedBlockStart.gifContractedBlock.gif    Employee.show 
=   function (s) dot.gif {          //show是Employee类的静态方法,只能由类调用,不能由实例对象调用.
InBlock.gif
        alert(s);
ExpandedBlockEnd.gif    }

None.gif    
// 由Employee类派生一个WorkerBee子类
ExpandedBlockStart.gifContractedBlock.gif
     function  WorkerBee(age,name,dept) dot.gif {        
InBlock.gif        
this.age = age || 0;
InBlock.gif        
this.name = name;
InBlock.gif        
this.dept = dept;        
ExpandedSubBlockStart.gifContractedSubBlock.gif        
this.toString = function()dot.gif{     //这里为WorkerBee类重载基类的toString方法.
InBlock.gif
            return this.name + "&" + this.dept + "&" + this.age;
ExpandedSubBlockEnd.gif        }
    
InBlock.gif        
ExpandedBlockEnd.gif    }
    
None.gif    WorkerBee.prototype 
=   new  Employee;
None.gif    
var  w  =   new  WorkerBee( 24 , " fanrong " , " 技术部 " );
None.gif    
None.gif    
// WorkerBee.show(w.toString());//调用失败,显然javascript不支持静态方法的继承.
None.gif
    Employee.show(w.toString());     // 这里w.toString()调用成功,表明支持类非静态方法与变量对象的继承
None.gif
       
None.gif
</ script >
        这里WorkerBee类继承并扩展了Employee类,重载了toString方法,但是比较遗憾,这里Employee.show静态方法不能为子类继承 :(

转载于:https://www.cnblogs.com/fcrong/archive/2006/08/11/474064.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值