Nếu bạn đang có kế hoạch thực hiện bất kỳ loại thừa kế, thì tôi muốn giới thiệu this.constructor
. Ví dụ đơn giản này sẽ minh họa tại sao:
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()
sẽ đăng nhập ConstructorSuper Hello ConstructorSuper!
vào giao diện điều khiển
test2.callPrint()
sẽ đăng nhập ConstructorSub Hello ConstructorSub!
vào giao diện điều khiển
Lớp được đặt tên sẽ không xử lý sự kế thừa độc đáo trừ khi bạn xác định lại rõ ràng mọi chức năng tạo tham chiếu đến Lớp được đặt tên. Đây là một ví dụ:
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()
sẽ đăng nhập NamedSuper Hello NamedSuper!
vào giao diện điều khiển
test4.callPrint()
sẽ đăng nhập NamedSuper Hello NamedSub!
vào giao diện điều khiển
Xem tất cả các hoạt động ở trên trong Babel REPL .
Bạn có thể thấy từ đây mà test4
vẫn nghĩ rằng nó thuộc siêu hạng; trong ví dụ này có vẻ như không phải là một vấn đề lớn, nhưng nếu bạn đang cố gắng tham chiếu các hàm thành viên đã bị ghi đè hoặc biến thành viên mới, bạn sẽ thấy mình gặp rắc rối.
SomeObject.print
cảm thấy tự nhiên Nhưngthis.n
bên trong không có ý nghĩa gì vì không có trường hợp nào, nếu chúng ta đang nói về các phương thức tĩnh.