在我们提供举例之前,我们需要介绍一个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;
}
文章来源于领测软件测试网 https://www.ltesting.net/