正 文

用AJAX开发智能Web应用程序之高级篇


www.7dspace.com  更新日期:2005-12-28 8:41:37  七度空间


  继承

  乍看之下,JavaScript缺乏对类层次的支持,这很相似于面向对象语言的程序员对于现代语言的期盼。然而,尽管 JavaScript句法没有象Java一样支持类继承,但是我们仍然能够在JavaScript中实现继承-通过把已定义类的一个实例拷贝到其派生类的原型当中。

  在我们提供举例之前,我们需要介绍一个constructor属性。JavaScript保证每一个原型中包含 constructor-它拥有到该构造器函数的一个参考。换句话说,Calculator.prototype.constructor包含一个到 Calculator()的参考。

  现在,下面的代码显示了怎样从基类Calculator派生类ArithmeticCalculator。其中,"第一行"取得类Calculator的所有的属性,而"第二行"把原型constructor的值恢复成ArithmeticCalculator:

function ArithmeticCalculator() { };
with (ArithmeticCalculator) {
 ArithmeticCalculator .prototype = new Calculator();//第一行
 prototype.constructor = ArithmeticCalculator;//第二行
}

  就算上面的实例看起来象一个合成体而不象是继承,但是JavaScript引擎还是清楚这个原型链的。特别是,instanceof操作符会正确地适用于基类和派生类。假定你创建类ArithmeticCalculator的一个新实例:

var c = new ArithmeticCalculator;

  表达式c instanceof Calculator和c instanceof ArithmeticCalculator都会成立。

  注意,在上面示例中的基类的constructor是在初始化ArithmeticCalculator原型时被调用的,而在创建派生类的实例时是不被调用的。这可能会带来不想要的负面影响,而且为了实现初始化你应该考虑创建一个独立的函数。由于该构造器并不是一个成员函数,所以它无法通过this参考引用调用。我们将需要一个能调用超类的"Calculator"成员函数:

function Calculator(ops) { ...};
with (Calculator) { prototype.Calculator=Calculator;}

  现在,我们可以写一个继承类-它显式地调用基类的构造器:

function ArithmeticCalculator(ops) { this.Calculator(ops);};
with (ArithmeticCalculator) {
 ArithmeticCalculator .prototype = new Calculator;
 prototype.constructor = ArithmeticCalculator;
 prototype.ArithmeticCalculator = ArithmeticCalculator;
}

  多态性

  JavaScript是一种非类型化的语言-在此,一切都是对象。因此,如果有两个类A和B,它们都定义一个foo(),那么JavaScript将允许在A和B的实例上多态地调用foo()-即使不存在层次关系(虽然是可实现的)。从这一角度来看,JavaScript提供一个比Java更宽的多态性。这种灵活性,象往常一样,也要付出代价。在这种情况中,代价是把类型检查工作代理到应用程序代码。具体地说,如果需要检查一个参考确实指向一个所希望的基类,那么这可以通过instanceof操作符来实现。

  另一方面,JavaScript并不检查函数调用中的参数-这可以防止用一样的命名和不同的参数来定义多态函数(并且让编译器选择正确的签名)。代之的是,JavaScript提供了一个Java 5风格的函数范围内的argument对象-它允许你根据参数的类型和数量的不同而实现一个不同的行为。

4页,页码:[1] [2] [3] [4] 

上一篇:用AJAX开发智能Web应用程序之基础篇
下一篇:如何恢复Windows“消失”的磁盘分区
作者:朱先忠编译  来源:天极网 ( 责任编辑:7dspace )
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐