หากคุณกำลังวางแผนในการทำชนิดของมรดกใด ๆ this.constructor
แล้วฉันจะแนะนำ ตัวอย่างง่ายๆนี้ควรอธิบายว่าทำไม:
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()
จะเข้าสู่ConstructorSuper Hello ConstructorSuper!
คอนโซล
test2.callPrint()
จะเข้าสู่ConstructorSub Hello ConstructorSub!
คอนโซล
คลาสที่มีชื่อจะไม่จัดการกับการสืบทอดอย่างแน่นอนเว้นแต่ว่าคุณจะกำหนดทุก ๆ ฟังก์ชันที่สร้างการอ้างอิงไปยังคลาสที่ระบุชื่ออย่างชัดเจน นี่คือตัวอย่าง:
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()
จะเข้าสู่NamedSuper Hello NamedSuper!
คอนโซล
test4.callPrint()
จะเข้าสู่NamedSuper Hello NamedSub!
คอนโซล
ดูทั้งหมดข้างต้นทำงานใน Babel REPL
คุณสามารถเห็นได้จากสิ่งนี้ซึ่งtest4
ยังคงคิดว่ามันอยู่ในระดับสูง ในตัวอย่างนี้อาจดูเหมือนไม่ได้เป็นเรื่องใหญ่ แต่ถ้าคุณพยายามอ้างอิงฟังก์ชั่นสมาชิกที่ถูกแทนที่หรือตัวแปรสมาชิกใหม่คุณจะพบว่าตัวเองมีปัญหา
SomeObject.print
รู้สึกเป็นธรรมชาติ แต่this.n
ข้างในทำให้ไม่มีเหตุผลเพราะไม่มีกรณีถ้าเรากำลังพูดถึงวิธีการคงที่