javascript - typescript 多态性

标签 javascript typescript polymorphism

请看一下这段代码:

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/

相关文章:

javascript - 将每个字符包装在 <i> 中

javascript - 当动画对象遇到div时是否可以停止?

javascript - TypeScript 索引签名对象的格式?

typescript - 如何在不破坏 localStorage 类型的情况下存储和获取对象?

c++ - 模板函数以外的 OCaml 多态性示例?

java - Java 中除了多态性还有其他选择吗?

javascript - JqueryUI Selectable - 不使用 Ctrl 取消选择

javascript - Angular Component 的 CSS 封装是如何工作的?

typescript - 如何动态/实用地生成 Angular 路由配置?

c++:没有强制转换的包含对象的确切类型