在< JavaScript:The Good Parts>中,Douglas引入了所谓的“伪古典”模式作为实现继承的方法之一。但是,似乎他给出的例子无法实现成员变量的继承,因为原型继承在构造“子类”时不会创建“超类”变量的副本。
对于一个具体的例子,让我们考虑两个类:一个 InputStream 类,它处理一个底层输入机制,并提供一个简单的读接口来逐字节读取;和 Utf8InputStream 类,它继承 InputStream 并提供 readUtf8 接口来读取有效的UTF8字符。然后在“伪经典”模式下它似乎有问题,因为所有Utf8InputStream将共享相同的底层InputStream,事情显然会中断。
在我看来,使用组合而不是继承很容易解决问题,但出于好奇,无论如何都要在这里实现成员变量的继承?
答案 0 :(得分:1)
然后在“伪经典”模式下似乎有问题,因为所有Utf8InputStream将共享相同的底层InputStream,事情显然会中断。
不,这只是在你做错了而create an instance for the prototype时才会发生。 Correct:
function Utf8InputStream(…) {
InputStream.call(this, …);
…
}
Utf8InputStream.prototype = Object.create(InputStream.prototype);