xbObjects的目的是为JavaScript提供更强的面向对象模型,不只支持继承,还支持方法的重载和调用超类方法的能力。要实现这一点,xbObjects需要执行下面的几步。
第一步:必须注册类,需定义它继承了那个类,调用方式如下: _classes.registerClass("Subclass_Name","Superclass_Name");
这里,子类和超类名都以字符串形式传进来,而不是指向它们的构造函数的指针。这个调用必须放在指定子类的构造函数前。如果新的类没有继承任何类,调用registerClass()时也可以只用第一个参数。
第二步:在构造函数内部调用defineClass()方法,传给它类名即被Clary称为原型函数的(prototype function)的指针,该函数用于初始化对象的所有属性和方法。例如:
_classes.registerClass("ClassA");
function ClassA(color) {
_classes.defineClass("ClassA",prototypeFunction);
function prototypeFunction() {
//...
}
}
可以看到,原型函数(prototypeFunction())位于构造函数内部。它的主要用途是在适当的时候把所有方法赋予该类(在这一点上与动态原型相似)
第三步是为该类创建init()方法。该方法负责设置该类的所有属性,它必须接受与构造函数相同的参数。作为一种规约,init()方法总是在defineClass()方法后调用。例如:
_classes.registerClass("ClassA");
function ClassA(sColor) {
_classes.defineClass("ClassA",prototypeFunction);
this.init(sColor);
function prototypeFunction() {
ClassA.prototype.init=function(sColor){
this.parentMethod("init");
this.color=sColor;
};
}
}
注意到在init()方法中调用了parentMethod()方法。xbObjects以这种方式允许类调用它的超类的方法。 parentMethod()方法接受任意多个参数,但第一个参数总是要调用的父类方法的名字(该参数必须是字符串,而不是函数指针),所有其他参数都被传给父类的方法。
第四步也是最后一步,在原型函数内添加类的其他方法:
_classes.registerClass("ClassA");
function ClassA(sColor){
_classes.defineClass("ClassA",prototypeFunction);
this.init(sColor);
function prototypeFunction() {
ClassA.prototype.init=function(sColor){
this.parentMethod("init");
this.color=sColor;
};
ClassA.prototype.showColor=function() {
alert(this.color);
};
}
}
然后,可以利用常规方式创建类的实例,并调用类的方法:
var aClass=new ClassA("red");
aClass.showColor();
例子:重写多边形类
<script type="text/javascript" src="xbObjects.js"></script>
<script type="text/javascript">
//继承机制的实现(2):实例
//其他的继承方式-xbObjects
//重写多边形类的例子
//首先重写Polygon类
_classes.registerClass("Polygon");
function Polygon(iSides){
_classes.defineClass("Polygon",prototypeFunction);
this.init(iSides);
function prototypeFunction(){
Polygon.prototype.init=function(iSides){
this.parentMethod("init");
this.sides=iSides;
};
Polygon.prototype.getArea=function(){
return 0;
};
}
}
//接着重写Triangle类
_classes.registerClass("Triangle","Polygon");
function Triangle(iBase,iHeight){
_classes.defineClass("Triangle",prototypeFunction);
this.init(iBase,iHeight);
function prototypeFunction(){
Triangle.prototype.init=function(iBase,iHeight){
this.parentMethod("init",3);
this.base=iBase;
this.height=iHeight;
};
Triangle.prototype.getArea=function(){
return 0.5*(this.base)*(this.height);
};
}
}
//Rectangle类的重写
_classes.registerClass("Rectangle","Polygon");
function Rectangle(iLength,iWidth){
_classes.defineClass("Rectangle",prototypeFunction);
this.init(iLength,iWidth);
function prototypeFunction(){
Rectangle.prototype.init=function(iLength,iWidth){
this.parentMethod("init",4);
this.length=iLength;
this.width=iWidth;
};
Rectangle.prototype.getArea=function(){
return (this.length)*(this.width);
};
}
}
//测试
var tri=new Triangle(4,8);//输出16
alert(tri.getArea());
var rec=new Rectangle(4,8);//输出32
alert(rec.getArea());
</script>
分享到:
相关推荐
在Java编程语言中,继承是面向对象特性之一,它允许我们创建一个类(子类或派生类)作为现有类(父类...通过学习这个实例,开发者能够更好地理解和运用Java的继承机制,从而在实际项目中实现更灵活、可扩展的代码结构。
在`案例3:通过实例来剖析C#继承机制`中,你可能将看到如何创建一个实际的继承链,如何调用父类和子类的方法,以及如何利用继承实现特定的业务逻辑。通过这种方式,你可以更深入地理解C#继承的实际应用和优势。 总...
通过理解和掌握以上C#继承机制的知识点,开发者可以在设计和实现类结构时更灵活、高效地利用代码复用,同时保证代码的可扩展性和维护性。在实际项目中,合理运用继承可以极大地提高软件开发的效率和质量。
寄生式继承是一种特殊的继承机制,它通过在子类中创建一个父类的实例,然后将其作为子类的原型来实现继承。这种继承机制非常灵活和强大,但它也存在一些缺点,例如,它不能实现多重继承。 Class Extend Class ...
2. 构造函数继承(Constructor Inheritance):这是 JavaScript中另一种常用的继承机制,通过将一个构造函数的 prototype 属性设置为另一个构造函数的实例,从而实现继承。 3. 混合继承(Mixins Inheritance):这是...
书中会通过实例来演示如何设计和使用类,以及如何利用继承和多态性来实现代码的复用和扩展。 3. **异常处理**:在编程中,异常是不可避免的。Java提供了丰富的异常处理机制,如try-catch-finally结构,帮助开发者...
总的来说,这个程序展示了Java中类的继承机制,如何通过构造方法传递参数来初始化对象,以及子类如何覆盖或扩展父类的属性。理解这些概念对于进行Java编程至关重要,因为它们构成了面向对象设计的基础。通过这样的...
本实例将深入剖析C#中的继承机制,帮助你更好地理解和应用这一概念。 首先,继承的基本语法是使用冒号(:)来表示子类对基类的继承。例如: ```csharp public class BaseClass { // 基类成员 } public class ...
JavaScript 是一种广泛应用于 Web 开发的脚本语言,它的继承机制是其面向对象特性的重要组成部分。在 JavaScript 中,继承主要用于创建类之间的关系,允许子类(派生类)继承父类(基类)的属性和方法,从而实现代码...
2. **继承Thread类**: - 当我们创建一个新的类继承自`Thread`时,这个类的实例就是线程对象。我们需要重写`Thread`类的`run()`方法,将线程需要执行的任务放入其中。 - 实例化这个类后,调用`start()`方法会启动...
总结来说,JavaScript中的继承机制虽然没有像其他面向对象语言那样直接,但通过对象冒充、原型继承和混合继承等方式,开发者可以有效地实现代码复用和面向对象的设计。在实际应用中,应根据项目需求选择合适的继承...
本文将深入探讨如何使用Qt实现程序单实例运行的两种方案,并对提供的源码修改进行解析。 ### 方案一:文件锁 文件锁是一种常见的实现单实例程序的方法,它通过创建一个临时文件或特定的标志文件来检查程序是否已经...
2. **继承机制**:在Delphi中,通过在派生窗体的声明中使用`inherits`关键字,可以指定其继承自哪个基类窗体。例如,`TFooForm = class(TBaseForm)`表示`TFooForm`继承自`TBaseForm`。 3. **覆盖或扩展方法**:在...
在C++编程语言中,继承是面向对象编程(OOP)的一个核心...学习这个实例将帮助初学者更好地理解C++中的继承机制及其在实际编程中的应用。通过动手实践,你可以加深对这一重要概念的理解,为以后的C++编程打下坚实基础。
通过上述示例代码,我们了解了如何在JavaScript中实现简单的继承机制。虽然这段代码提供了一种实现方式,但在实际项目中,更推荐使用ES6的类语法来实现继承,因为它更简洁且易于理解。此外,也可以考虑使用现有的库...
JavaScript的继承机制主要基于原型链,本文将深入探讨JavaScript的继承与多继承,并通过实例进行分析。 1. **JavaScript继承** - **原理**:JavaScript的继承主要是通过原型链(prototype chain)来实现的。每个...
Java 语言中的继承机制允许一个类继承另一个类的属性和行为,实现代码的重用和继承关系建模。在 Java 中,继承是通过使用 `extends` 关键字来实现的,格式为 `public 子类 extends 父类{}`。 继承的优点: 1. 代码...
【C#继承机制详解】 C#作为一门面向对象的编程语言,其继承性(Inheritance)是核心特性之一,旨在促进代码的复用和扩展,提高软件开发的效率。继承允许一个类(派生类)从另一个类(基类)获取特征和功能,同时还...