1、类的定义采用构造函数-原型方式
定义polygon类及其子类-采用混合继承方式,即用对象冒充继承构造函数的属性,用原型链继承prototype对象的方法。
2、类的定义采用动态原型方式-继承无法利用动态原型方式实现
继承无法利用动态原型方式实现,原因在于prototype的特性,问题主要是由下面代码的位置因此的:Triangle.prototype=new Polygon(); 因为在代码运行前,对象已被实例化,并与原始的prototype对象联系在了一起。虽然用极晚绑定可使对原型对象的修改正确地表现出来,但替换 prototype对象却不会对该对象产生任何影响。只有未来的实例才会反映出这种改变,所以上面的例子会出现错误。代码进行下面的修改以后,就可以正常运行了。
3、其他的继承方式--zInherit
(1)利用inheritfrom重写Polygon类
(2)动态原型支持
动态原型支持:原型链方式不能真正符合动态原型的主旨,即把类的所有代码放置在它的构造函数中。这种方法实现的原因是,使用inheritForm()方法时,并未重写prototype对象,只是为其加入方法而已。使用这种方法,即可避开原型链的限制,实现动态原型本意。
(3)多重继承支持
多重继承支持:zInherit库最有用的特性之一是支持多重继承,原型链不支持多重继承。同样利用inheritForm()方法实现。要继承属性和方法,inheritForm()方法必须与对象冒充一起使用,注意这里使用的是apply()方法。一般来说,按照继承属性的顺序继承方法比较好。
定义polygon类及其子类-采用混合继承方式,即用对象冒充继承构造函数的属性,用原型链继承prototype对象的方法。
function Polygon(iSides){ this.sides=iSides; } Polygon.prototype.getArea=function(){ return 0; }; //三角形子类 function Triangle(iSides,iBase,iHeight){ Polygon.call(this,iSides);//用对象冒充继承构造函数的属性 this.base=iBase; this.height=iHeight; } Triangle.prototype=new Polygon();//用原型链继承prototype对象的方法 Triangle.prototype.getArea=function(){ return 0.5*(this.base)*(this.height); }; var oTriangle=new Triangle(3,4,8); alert(oTriangle.getArea());//16 //矩形子类 function Rectangle(iLength,iWidth){ Polygon.call(this,4);//用对象冒充继承构造函数的属性 this.length=iLength; this.width=iWidth; } Rectangle.prototype=new Polygon();;//用原型链继承prototype对象的方法 Rectangle.prototype.getArea=function(){ return (this.length*this.width); } var oRectangle=new Rectangle(4,8); alert(oRectangle.getArea());//32
2、类的定义采用动态原型方式-继承无法利用动态原型方式实现
function Polygon(iSides){ this.sides=iSides; if(typeof Polygon._initialized_=="undefined"){ Polygon.prototype.getArea=function(){ return 0; } } Polygon._initialized_=true; } function Triangle(iLength,iWidth){ Polygon.call(this,3); this.length=iLength; this.width=iWidth; if(typeof Triangle._initialized_=="undefined"){ Triangle.prototype=new Polygon(); Triangle.prototype.getArea=function(){ return (this.length)*(this.width); } } Triangle._initialized_=true; } var oTriangle=new Triangle(4,8); //控制台输出错误消息"oTriangle.getArea is not a function" alert(oTriangle.getArea());
继承无法利用动态原型方式实现,原因在于prototype的特性,问题主要是由下面代码的位置因此的:Triangle.prototype=new Polygon(); 因为在代码运行前,对象已被实例化,并与原始的prototype对象联系在了一起。虽然用极晚绑定可使对原型对象的修改正确地表现出来,但替换 prototype对象却不会对该对象产生任何影响。只有未来的实例才会反映出这种改变,所以上面的例子会出现错误。代码进行下面的修改以后,就可以正常运行了。
function Polygon(iSides){ this.sides=iSides; if(typeof Polygon._initialized_=="undefined"){ Polygon.prototype.getArea=function(){ return 0; } } Polygon._initialized_=true; } function Triangle(iLength,iWidth){ Polygon.call(this,3); this.length=iLength; this.width=iWidth; if(typeof Triangle._initialized_=="undefined"){ Triangle.prototype.getArea=function(){ return 0.5*(this.length)*(this.width); } } Triangle._initialized_=true; } Triangle.prototype=new Polygon(); var oTriangle=new Triangle(4,8); alert(oTriangle.getArea());//16
3、其他的继承方式--zInherit
(1)利用inheritfrom重写Polygon类
function Polygon(iSides){ this.sides=iSides; } Polygon.prototype.getArea=function(){ return 0; } function Triangle(iBase,iHeight){ Polygon.call(this,3); this.base=iBase; this.height=iHeight; } Triangle.prototype.inheritFrom(Polygon); Triangle.prototype.getArea=function(){ return 0.5*(this.base)*(this.height); } function Rectangle(iLength,iWidth){ Polygon.call(this,4); this.length=iLength; this.width=iWidth; } Rectangle.prototype.inheritFrom(Polygon); Rectangle.prototype.getArea=function(){ return (this.length)*(this.width); } var oTri=new Triangle(4,8);//16 alert(oTri.getArea()); var oRec=new Rectangle(4,8);//32 alert(oRec.getArea()); alert(oTri.instanceOf(Polygon));//true alert(oTri.instanceOf(Triangle));//true alert(oRec.instanceOf(Polygon));//true alert(oRec.instanceOf(Rectangle));//true
(2)动态原型支持
动态原型支持:原型链方式不能真正符合动态原型的主旨,即把类的所有代码放置在它的构造函数中。这种方法实现的原因是,使用inheritForm()方法时,并未重写prototype对象,只是为其加入方法而已。使用这种方法,即可避开原型链的限制,实现动态原型本意。
//dinamic prototype support function Polygon(iSides){ this.sides=iSides; if(typeof Polygon._initialized_=="undefined"){ Polygon.prototype.getArea=function(){ return 0; } } return Polygon._initialized_=true; } function Triangle(iBase,iHeight){ Polygon.call(this,3); this.base=iBase; this.height=iHeight; if(typeof Triangle._initialized_=="undefined"){ Triangle.prototype.inheritFrom(Polygon); Triangle.prototype.getArea=function(){ return 0.5*(this.base)*(this.height); } } Triangle._initialized_=true; } function Rectangle(iLength,iWidth){ Polygon.call(this,4); this.length=iLength; this.width=iWidth; if(typeof Rectangle._initialized_=="undefined"){ Rectangle.prototype.inheritFrom(Polygon); Rectangle.prototype.getArea=function(){ return (this.length)*(this.width); } } Rectangle._initialized_=true; } var tri=new Triangle(4,8); alert(tri.getArea());//16 alert(tri.instanceOf(Polygon));//true alert(tri.instanceOf(Triangle));//true var rec=new Rectangle(4,8); alert(rec.getArea());//32 alert(rec.instanceOf(Polygon));//true alert(rec.instanceOf(Rectangle));//true
(3)多重继承支持
多重继承支持:zInherit库最有用的特性之一是支持多重继承,原型链不支持多重继承。同样利用inheritForm()方法实现。要继承属性和方法,inheritForm()方法必须与对象冒充一起使用,注意这里使用的是apply()方法。一般来说,按照继承属性的顺序继承方法比较好。
//multiple inheritance support function ClassA(){ this.messageA="the message of Class A"; if(typeof ClassA._initialized_=="undefined"){ ClassA.prototype.showMessageA=function(){ alert(this.messageA); }; ClassA._initialized_=true; } } function ClassB(){ this.messageB="the message of Class B"; if(typeof ClassB._initialized_=="undefined"){ ClassB.prototype.showMessageB=function(){ alert(this.messageB); }; ClassB._initialized_=true; } } function ClassC(){ ClassA.apply(this); ClassB.apply(this); this.messageC="the message of Class C"; if(typeof ClassC._initialized_=="undefined"){ ClassC.prototype.inheritFrom(ClassA); ClassC.prototype.inheritFrom(ClassB); ClassC.prototype.showMessageC=function(){ alert(this.messageC); }; ClassC._initialized_=true; } } var cClass=new ClassC(); cClass.showMessageA();//the message of Class A cClass.showMessageB();//the message of Class B cClass.showMessageC();//the message of Class C
发表评论
-
继承机制的实现(2):实例
2009-03-26 15:54 816xbObjects的目的是为JavaScr ... -
连接字符串实例代码
2009-03-18 14:16 922两种连接字符串的方法代码如下。一种是利用“+”实现,另一种是利 ... -
修改对象实例代码
2009-03-18 13:54 965//create new method Number.p ... -
继承方式
2009-03-18 12:59 7411、对象冒充 //对象冒充对应构造函数方式 //对象冒 ... -
定义类的方式
2009-03-18 12:43 8031、工厂方式 function createCar(){ ...
相关推荐
在Java编程语言中,继承是面向对象特性之一,它允许我们创建一个类(子类或派生类)作为现有类(父类...通过学习这个实例,开发者能够更好地理解和运用Java的继承机制,从而在实际项目中实现更灵活、可扩展的代码结构。
JavaScript 是一种广泛应用于 Web 开发的脚本语言,它的继承机制是其面向对象特性的重要组成部分。在 JavaScript 中,继承主要用于创建类之间的关系,允许子类(派生类)继承父类(基类)的属性和方法,从而实现代码...
在`案例3:通过实例来剖析C#继承机制`中,你可能将看到如何创建一个实际的继承链,如何调用父类和子类的方法,以及如何利用继承实现特定的业务逻辑。通过这种方式,你可以更深入地理解C#继承的实际应用和优势。 总...
寄生式继承是一种特殊的继承机制,它通过在子类中创建一个父类的实例,然后将其作为子类的原型来实现继承。这种继承机制非常灵活和强大,但它也存在一些缺点,例如,它不能实现多重继承。 Class Extend Class ...
通过理解和掌握以上C#继承机制的知识点,开发者可以在设计和实现类结构时更灵活、高效地利用代码复用,同时保证代码的可扩展性和维护性。在实际项目中,合理运用继承可以极大地提高软件开发的效率和质量。
2. 构造函数继承(Constructor Inheritance):这是 JavaScript中另一种常用的继承机制,通过将一个构造函数的 prototype 属性设置为另一个构造函数的实例,从而实现继承。 3. 混合继承(Mixins Inheritance):这是...
书中会通过实例来演示如何设计和使用类,以及如何利用继承和多态性来实现代码的复用和扩展。 3. **异常处理**:在编程中,异常是不可避免的。Java提供了丰富的异常处理机制,如try-catch-finally结构,帮助开发者...
总的来说,这个程序展示了Java中类的继承机制,如何通过构造方法传递参数来初始化对象,以及子类如何覆盖或扩展父类的属性。理解这些概念对于进行Java编程至关重要,因为它们构成了面向对象设计的基础。通过这样的...
本实例将深入剖析C#中的继承机制,帮助你更好地理解和应用这一概念。 首先,继承的基本语法是使用冒号(:)来表示子类对基类的继承。例如: ```csharp public class BaseClass { // 基类成员 } public class ...
### 面向对象抽象思维与Java继承机制 #### 一、抽象的含义 在面向对象编程中,**抽象**是一种关键概念,它涉及到从具体的实体中提取共同特征和行为的过程。通过抽象,程序员能够专注于对象的核心特征和功能,而...
在C++编程语言中,继承是面向对象编程(OOP)的一个核心...学习这个实例将帮助初学者更好地理解C++中的继承机制及其在实际编程中的应用。通过动手实践,你可以加深对这一重要概念的理解,为以后的C++编程打下坚实基础。
Java 语言中的继承机制允许一个类继承另一个类的属性和行为,实现代码的重用和继承关系建模。在 Java 中,继承是通过使用 `extends` 关键字来实现的,格式为 `public 子类 extends 父类{}`。 继承的优点: 1. 代码...
JavaScript的继承机制主要基于原型链,本文将深入探讨JavaScript的继承与多继承,并通过实例进行分析。 1. **JavaScript继承** - **原理**:JavaScript的继承主要是通过原型链(prototype chain)来实现的。每个...
JavaScript,作为一种基于原型的面向对象语言,其继承机制与传统的类继承有所不同。在JS中,对象可以直接通过原型链实现继承,而无需像Java那样使用`extends`关键字。本文档将探讨JavaScript中的继承实现方式及其优...
【C#继承机制详解】 C#作为一门面向对象的编程语言,其继承性(Inheritance)是核心特性之一,旨在促进代码的复用和扩展,提高软件开发的效率。继承允许一个类(派生类)从另一个类(基类)获取特征和功能,同时还...
通过分析和实践`source.js`中的代码,我们可以更好地理解JavaScript的继承机制,掌握如何灵活地构建可扩展的对象模型。这不仅有助于提升我们的编程能力,也是面试中经常被问到的问题,因此深入学习和掌握这部分内容...
### 浅析JavaScript原型继承机制 #### 一、引言 JavaScript作为一种动态语言,其对象模型与传统的面向对象编程语言有所不同。在JavaScript中,并没有直接提供类的概念,而是通过原型来实现继承。本文将深入探讨...
通过上述示例代码,我们了解了如何在JavaScript中实现简单的继承机制。虽然这段代码提供了一种实现方式,但在实际项目中,更推荐使用ES6的类语法来实现继承,因为它更简洁且易于理解。此外,也可以考虑使用现有的库...