typescript - Apa tujuan pemanggilan super() dalam subclass TS?
Selain menjadi menjengkelkan dan membuat sehingga setiap subclass harus diubah setiap kali kelas induk diperbarui...
Jawaban #1
Pertimbangkan kode berikut:
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);
}
}
Pemanggilan super di ctor kelas B memanggil ctor dari kelas A, dan jika kita melihat kode javascript yang dikompilasi:
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));
Seharusnya jelas mengapa kita melakukan itu, karena jika tidak, semua yang terjadi di konstruktor A tidak akan terjadi, yaitu anggota x, y dan sum tidak akan terassign di instance dari kelas B.
Anda mungkin kemudian bertanya "baiklah, tapi kenapa itu tidak terjadi secara otomatis? mengapa compiler tidak bisa memanggil super untuk saya?"
Itu adalah pertanyaan yang wajar, dan saya bisa memikirkan 2 alasan utama:
(1) Karena terkadang Anda ingin melakukan sesuatu sebelum memanggil super, misalnya:
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);
}
}
}
Anda harus memanggil super sebelum Anda mengakses this di konstruktor B.
(2) Ini membuatnya jelas bahwa ini yang sedang terjadi, jika tidak, kamu mungkin tidak mengharapkannya terjadi karena kamu tidak melihatnya.
Persyaratan ini hanya berlaku untuk konstruktor, metode kelas tidak diwajibkan untuk memanggil super mereka, tetapi Anda bebas melakukannya jika ingin mengeksekusi fungsi metode induk.
