科技时代新浪首页 > 科技时代 > 学园 > 正文

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


http://www.sina.com.cn 2005年12月27日 17:31 天极yesky

    继承

  乍看之下,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对象-它允许你根据参数的类型和数量的不同而实现一个不同的行为。

[上一页] [1] [2] [3] [4] [下一页]

发表评论

爱问(iAsk.com)



评论】【论坛】【收藏此页】【 】【多种方式看新闻】【下载点点通】【打印】【关闭




科技时代意见反馈留言板 电话:010-82628888-5595   欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2005 SINA Inc. All Rights Reserved

版权所有 新浪网