使用"伪古典"在JavaScript中实现成员变量继承图案

时间:2014-03-27 22:52:29

标签: javascript oop inheritance

在< JavaScript:The Good Parts>中,Douglas引入了所谓的“伪古典”模式作为实现继承的方法之一。但是,似乎他给出的例子无法实现成员变量的继承,因为原型继承在构造“子类”时不会创建“超类”变量的副本。

对于一个具体的例子,让我们考虑两个类:一个 InputStream 类,它处理一个底层输入机制,并提供一个简单的接口来逐字节读取;和 Utf8InputStream 类,它继承 InputStream 并提供 readUtf8 接口来读取有效的UTF8字符。然后在“伪经典”模式下它似乎有问题,因为所有Utf8InputStream将共享相同的底层InputStream,事情显然会中断。

在我看来,使用组合而不是继承很容易解决问题,但出于好奇,无论如何都要在这里实现成员变量的继承?

1 个答案:

答案 0 :(得分:1)

  

然后在“伪经典”模式下似乎有问题,因为所有Utf8InputStream将共享相同的底层InputStream,事情显然会中断。

不,这只是在你做错了而create an instance for the prototype时才会发生。 Correct

function Utf8InputStream(…) {
    InputStream.call(this, …);
    …
}
Utf8InputStream.prototype = Object.create(InputStream.prototype);