TS子类中super()调用的目的是什么?

时间:2016-07-07 22:07:28

标签: typescript

除了令人讨厌并使其更新以便在更新父类时需要触及每个子类......

1 个答案:

答案 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中发生的一切都不会发生,即成员xy和{{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)它明确表示这是正在发生的事情,否则你可能不会指望它发生,因为你没有看到它。

此要求仅对构造函数有效,类方法不需要调用它们的超级,但如果要执行父方法功能,则可以自由执行。