Jika Anda berencana melakukan warisan apa pun, maka saya akan merekomendasikan this.constructor
. Contoh sederhana ini harus menggambarkan mengapa:
class ConstructorSuper {
constructor(n){
this.n = n;
}
static print(n){
console.log(this.name, n);
}
callPrint(){
this.constructor.print(this.n);
}
}
class ConstructorSub extends ConstructorSuper {
constructor(n){
this.n = n;
}
}
let test1 = new ConstructorSuper("Hello ConstructorSuper!");
console.log(test1.callPrint());
let test2 = new ConstructorSub("Hello ConstructorSub!");
console.log(test2.callPrint());
test1.callPrint()
akan masuk ConstructorSuper Hello ConstructorSuper!
ke konsol
test2.callPrint()
akan masuk ConstructorSub Hello ConstructorSub!
ke konsol
Kelas bernama tidak akan berurusan dengan warisan dengan baik kecuali jika Anda secara eksplisit mendefinisikan kembali setiap fungsi yang membuat referensi ke Kelas bernama. Berikut ini sebuah contoh:
class NamedSuper {
constructor(n){
this.n = n;
}
static print(n){
console.log(NamedSuper.name, n);
}
callPrint(){
NamedSuper.print(this.n);
}
}
class NamedSub extends NamedSuper {
constructor(n){
this.n = n;
}
}
let test3 = new NamedSuper("Hello NamedSuper!");
console.log(test3.callPrint());
let test4 = new NamedSub("Hello NamedSub!");
console.log(test4.callPrint());
test3.callPrint()
akan masuk NamedSuper Hello NamedSuper!
ke konsol
test4.callPrint()
akan masuk NamedSuper Hello NamedSub!
ke konsol
Lihat semua yang di atas berjalan di Babel REPL .
Anda dapat melihat dari ini yang test4
masih berpikir itu di kelas super; dalam contoh ini mungkin tidak tampak seperti masalah besar, tetapi jika Anda mencoba untuk mereferensikan fungsi anggota yang telah ditimpa atau variabel anggota baru, Anda akan menemukan diri Anda dalam masalah.
SomeObject.print
terasa alami. Tetapithis.n
di dalam tidak masuk akal karena tidak ada contoh, jika kita berbicara tentang metode statis.