TypeScript访问基类的成员
请参阅TypeScript站点上操场的inheritance示例:
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。 智能感知是build议我可以使用它和TypeScript编译好,但它不工作。 有任何想法吗?
工作示例。 下面的注释。
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);
-
您不需要手动将名称分配给公共variables。 在构造函数定义中使用
public name
为你做这个。 -
你不需要从专门的课程中调用
super(name)
。 -
使用
this.name
工作。
关于使用super
注意事项。
这在语言规范的第4.8.2节中有更详细的介绍。
从Animal
inheritance的类的行为与其他语言的行为没有什么不同。 您需要指定super
关键字以避免专用函数和基类函数之间的混淆。 例如,如果你调用move()
或this.move()
你将会处理专门的Snake
或Horse
函数,所以使用super.move()
明确地调用基类函数。
属性没有混淆,因为它们是实例的属性。 super.name
和this.name
没有什么区别 – 只有this.name
。 否则,您可以创build一个具有不同名称的Horse,具体取决于您是在专门的类还是在基类中。