请参阅TypeScript站点上的playground中的继承示例:
class Animal {
public name;
constructor(name) {
this.name = name;
}
move(meters) {
alert(this.name + " moved " + meters + "m.");
}
}
class Snake extends Animal {
constructor(name) { super(name); }
move() {
alert("Slithering...");
super.move(5);
}
}
class Horse extends Animal {
constructor( name) { super(name); }
move() {
alert(super.name + " is Galloping...");
super.move(45);
}
}
var sam = new Snake("Sammy the Python")
var tom: Animal = new Horse("Tommy the Palomino")
sam.move()
tom.move(34)
我更改了一行代码:Horse.move()
中的提醒。我想访问super.name
,但只返回undefined
。 IntelliSense建议我可以使用它并且TypeScript编译得很好,但它不起作用。
有什么想法吗?
答案 0 :(得分:147)
工作示例。以下注释。
class Animal {
constructor(public name) {
}
move(meters) {
alert(this.name + " moved " + meters + "m.");
}
}
class Snake extends Animal {
move() {
alert(this.name + " is Slithering...");
super.move(5);
}
}
class Horse extends Animal {
move() {
alert(this.name + " is Galloping...");
super.move(45);
}
}
var sam = new Snake("Sammy the Python");
var tom: Animal = new Horse("Tommy the Palomino");
sam.move();
tom.move(34);
您无需手动将名称指定给公共变量。在构造函数定义中使用public name
可以为您执行此操作。
您无需从专业课程中拨打super(name)
。
使用this.name
有效。
使用super
的说明。
在语言规范的section 4.9.2中有更详细的介绍。
从Animal
继承的类的行为与其他语言中的行为没有什么不同。您需要指定super
关键字,以避免在专用函数和基类函数之间产生混淆。例如,如果您调用了move()
或this.move()
,那么您将处理专门的Snake
或Horse
函数,因此使用super.move()
显式调用基类函数
没有属性的混淆,因为它们是实例的属性。 super.name
和this.name
之间没有区别 - 只有this.name
。否则,您可以创建一个具有不同名称的Horse,具体取决于您是在专业类还是基类中。
答案 1 :(得分:0)
您错误地使用了super
和this
关键字。这是它们如何工作的示例:
class Animal {
public name: string;
constructor(name: string) {
this.name = name;
}
move(meters: number) {
console.log(this.name + " moved " + meters + "m.");
}
}
class Horse extends Animal {
move() {
console.log(super.name + " is Galloping...");
console.log(this.name + " is Galloping...");
super.move(45);
}
}
var tom: Animal = new Horse("Tommy the Palomino");
Animal.prototype.name = 'horseee';
tom.move(34);
// Outputs:
// horseee is Galloping...
// Tommy the Palomino is Galloping...
// Tommy the Palomino moved 45m.
说明:
super.name
,这是指对象tom
而不是对象tom
自身的原型链。因为我们在Animal.prototype
上添加了name属性,所以将输出horseee。this.name
,this
关键字引用了tom对象本身。 move
方法记录第三条日志。从Horse类的移动方法中,使用语法super.move(45);
调用此方法。在这种情况下使用super
关键字将在Animal原型上找到的原型链上寻找一种move
方法。请记住,TS仍然在底层使用原型,并且class
和extends
关键字只是原型继承上的语法糖。