请看一下这段代码:
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
转换为扩展类?
答案 0 :(得分:5)
JS(和TS)中的方法附加到附加到每个实例的原型(类似于虚方法表)。当您调用方法时,实际函数将从实例的原型链中检索,而不是从对象的已知类型中检索。我所知道的最接近的等价物是C ++中的sleep(1)
方法。
在代码中:
Thread
答案 1 :(得分:4)
您已经将greeter
投射到了它的父类。
类中的重写方法在转换为父类时不会改变行为。
答案 2 :(得分:2)
我认为你误解了施法。它不是“转换成”而是“解释为”。它基本上为编译器提供了一个提示,即他正在处理的类型/接口,因此可以使用属性和方法。它没有说明这些方法的实现,只有它们的签名(类型进入,类型出来)
答案 3 :(得分:0)
Casting只告诉编译器将变量视为具有特定类型的变量。
Casting对输出的JavaScript代码没有影响。它有时允许编译器在认为你将类型A视为类型B时不会发出错误。但是JavaScript代码没有类型的概念。
您的类实例有一个名为greet的属性,它隐藏了该对象原型的属性(基类greet函数)。因此,被调用的函数始终是继承行中最低的函数。
您可能希望查看输出代码,然后应用您对原型继承的了解来理解该代码。