除了令人讨厌并使其更新以便在更新父类时需要触及每个子类......
答案 0 :(得分:8)
请考虑以下代码:
class A {
protected sum: number;
constructor(protected x: number, protected y: number) {
this.sum = this.x + this.y;
}
}
class B extends A {
constructor(x: number, y: number) {
super(x, y);
}
}
在课程super
的ctor中调用B
会调用类A
的ctor,如果我们查看已编译的javascript代码:
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var A = (function () {
function A(x, y) {
this.x = x;
this.y = y;
this.sum = this.x + this.y;
}
return A;
}());
var B = (function (_super) {
__extends(B, _super);
function B(x, y) {
_super.call(this, x, y);
}
return B;
}(A));
应该清楚为什么我们这样做,因为否则A
的ctor中发生的一切都不会发生,即成员x
,y
和{{1} }}不会在类sum
的实例中分配。
然后你可能会问“好,好,但为什么不自动发生?为什么编译器不能只为我调用B
?”
这是一个公平的问题,我可以想出两个主要原因:
(1)因为有时候你想在调用super
之前做某事,例如:
super
您必须先致电class A {
protected sum: number;
constructor(protected x: number, protected y: number) {
this.sum = this.x + this.y;
}
}
class B extends A {
constructor(x: number, y: number) {
if (x % 2 === 0) {
super(x, y);
} else {
super(x + 1, y);
}
}
}
,然后才能访问super
的{{1}}中的this
。
(2)它明确表示这是正在发生的事情,否则你可能不会指望它发生,因为你没有看到它。
此要求仅对构造函数有效,类方法不需要调用它们的超级,但如果要执行父方法功能,则可以自由执行。