请看一下这段代码:
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
class Ge extends Greeter {
constructor(message: string) {
super(message);
}
greet() {
return "walla " + super.greet();
}
}
let greeter = new Ge("world");
console.log(greeter.greet()); // walla Hello, world
console.log((<Greeter> greeter).greet()); // walla Hello, world
我希望第二个日志打印Hello, world
。
查看转译后的 Javascript
代码,我看到了完全相同的命令,所以这并不奇怪。
真正的问题是,如何将 greeter
转换为它的扩展类?
最佳答案
JS(和 TS)中的方法附加到附加到每个实例的原型(prototype)(类似于虚拟方法表)。当您调用一个方法时,实际函数是从实例的原型(prototype)链而不是对象的已知类型中检索的。我所知道的最接近的等效方法是 C++ 中的 virtual
方法。
在代码中:
let greeter = new Ge('world');
// You expect:
Greeter.prototype.greet.call(greeter);
// JS actually does:
greeter.prototype.greet.call(greeter);
关于javascript - typescript 多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39082330/