打字稿多态性

joh*_*hni 5 javascript polymorphism typescript

请看下面的代码:

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
Run Code Online (Sandbox Code Playgroud)

我希望第二个日志能够打印出来Hello, world。查看转Javascript码后的代码,我看到的是完全相同的命令,所以这并不奇怪。

真正的问题是,您如何greeter转换为扩展类?

Jus*_*ner 8

你已经投到greeter了它的父类。

类中的重写方法在转换为其父类时不会改变行为。


ssu*_*ube 5

JS(和TS)中的方法被附加到原型,该原型被附加到每个实例(类似于虚拟方法表)。调用方法时,实际函数是从实例的原型链中检索的,而不是从对象的已知类型中检索的。我知道的最接近的等效项是virtualC ++ 中的方法。

在代码中:

let greeter = new Ge('world');
// You expect:
Greeter.prototype.greet.call(greeter);
// JS actually does:
greeter.prototype.greet.call(greeter);
Run Code Online (Sandbox Code Playgroud)