@Bergi đã đề cập new.target.prototype
, nhưng tôi đang tìm kiếm một ví dụ cụ thể chứng minh rằng bạn có thể truy cập this
(hoặc tốt hơn, tham chiếu đến đối tượng mà mã máy khách đang tạo new
, xem bên dưới) mà không cần phải gọi super()
.
Nói là rẻ, cho tôi xem mã ... Vì vậy, đây là một ví dụ:
class A { // Parent
constructor() {
this.a = 123;
}
parentMethod() {
console.log("parentMethod()");
}
}
class B extends A { // Child
constructor() {
var obj = Object.create(new.target.prototype)
// You can interact with obj, which is effectively your `this` here, before returning
// it to the caller.
return obj;
}
childMethod(obj) {
console.log('childMethod()');
console.log('this === obj ?', this === obj)
console.log('obj instanceof A ?', obj instanceof A);
console.log('obj instanceof B ?', obj instanceof B);
}
}
b = new B()
b.parentMethod()
b.childMethod(b)
Cái nào sẽ xuất ra:
parentMethod()
childMethod()
this === obj ? true
obj instanceof A ? true
obj instanceof B ? true
Vì vậy, bạn có thể thấy rằng chúng ta đang tạo hiệu quả một đối tượng kiểu B
(lớp trẻ) cũng là một đối tượng kiểu A
(lớp cha của nó) và trong childMethod()
các con B
chúng tôi đã this
trỏ đến đối tượng obj
mà chúng tôi tạo ra trong B constructor
với Object.create(new.target.prototype)
.
Và tất cả những điều này mà không cần quan tâm đến super
chút nào.
Điều này thúc đẩy thực tế là trong JS, a constructor
có thể trả về một đối tượng hoàn toàn khác khi mã máy khách tạo một phiên bản mới với new
.
Hy vọng điều này sẽ giúp ai đó.