Kế thừa của function trong javascript

Xin chào.
Đoạn code này là dùng để kế thừa lớp Person cho lớp student.
Bạn nào giải thích cho mình cách thực hiện đc ko ạ

T ko hiểu vai trò và tác dụng 2 dòng này

Person.call()

// Tại sao cần dòng này ạ?
Student.prototype = new Person();
function Person(firstName, lastName) {
    this.FirstName = firstName || "unknown";
    this.LastName = lastName || "unknown";            
}

Person.prototype.getFullName = function () {
    return this.FirstName + " " + this.LastName;
}
function Student(firstName, lastName, schoolName, grade)
{
    Person.call(this, firstName, lastName);

    this.SchoolName = schoolName || "unknown";
    this.Grade = grade || 0;
}
//Student.prototype = Person.prototype;
Student.prototype = new Person();
Student.prototype.constructor = Student;

var std = new Student("James","Bond", "XYZ", 10);
            
alert(std.getFullName()); // James Bond
alert(std instanceof Student); // true
alert(std instanceof Person); //

Bạn nên tìm hiểu cú pháp javascript trước khi đặt những câu hỏi như này
Đây cũng không phải code dành cho beginner
Đoạn code này dùng cho mục đích chém gió là chính, nên cần phải có kiến thức javascript tốt để đọc

3 Likes

prototype của function F là một đối tượng mà mọi đối tượng tạo ra bằng new F() sẽ trỏ đến.
Khi bạn muốn tạo mọi student có phương thức getFullName() mà không muốn copy method đó cho tất cả đối tượng (như vậy sẽ phí tài nguyên) thì bạn gắn method đó cho prototype của function.
Vì prototype chỉ có một nên hiệu quả và dễ quản lý hơn.

Bây giờ khi bạn chạy std.getFullName(), JS engine sẽ không tìm thấy method getFullName trong code của Student và tiếp tục tìm trong prototype của Student, lúc này prototype đó đã là 1 đối tượng Person và đối tượng này có method kể trên.
Đây là câu hỏi hay và đụng vào phần khá lằng nhằng của JavaScript. Cheers!

5 Likes

Quên chưa trả lời dòng Person.call(this, firstName, lastName);

Trong JS có một thứ khá loằng ngoằng là this, nó thường trỏ đến những thứ ta không ngờ tới.
Nhưng cơ bản khi tạo một đối tượng bằng new Function thì JS sẽ tạo một đối tượng mới và this trong code của Function sẽ trỏ về đối tượng đó.
Khi ta gọi hàm và muốn ép nó phải sử dụng this trỏ vào đối tượng nào thì dùng call
F(doituongthis, …)
Person.call(this, firstName, lastName) buộc std mới tạo có this với hai thuộc tính firstName và lastName.
Sau này khi bạn gọi getFullName() method trên prototype nó sẽ tìm đến thuộc tính this của đối tượng std để tìm this.firstName, this.lastName.

Nếu xóa dòng lệnh trên đi thì, mọi student bạn tạo sẽ đều có tên là “unknown” hết. Bạn thử xem.

Đây là chủ đề cũng không đơn giản. Điều bạn hỏi có chi tiết trong sách You Don’t Know JS của Kyle Simpson cuốn: this & Object Prototypes.

5 Likes

Thừa kế trong js viết kiểu này hơi phức tạp nên mới đẻ ra từ khóa extends đó.
Chi tiết tham khảo ở đây
https://ninja-it.com/javascript/prototypes/inheritance/

3 Likes

class trong JS sau này mới có.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?