Tôi đang viết lại một dự án JavaScript và tôi muốn có thể sử dụng các phương pháp hướng đối tượng để tổ chức mớ hỗn độn mà mã hiện tại là. Mối quan tâm chính là JavaScript này được cho là chạy dưới dạng tiện ích bên trong các trang web của bên thứ ba và tôi không thể xung đột với các thư viện JavaScript khác mà các trang web khác có thể sử dụng.Phương pháp kế thừa Javascript tối giản tốt là gì?
Vì vậy, tôi đang tìm kiếm một cách để viết "đẳng cấp như" thừa kế trong JavaScript có các yêu cầu sau:
- Không thư viện bên ngoài hoặc những thứ đó sẽ mâu thuẫn với một thư viện bên ngoài (mà ngăn cản bản sao & dán từ thư viện bên ngoài).
- Minimalistic - Tôi không muốn mã hỗ trợ lớn hơn sau đó một vài dòng mã và tôi không muốn các nhà phát triển cần nhiều nồi hơi mỗi khi họ xác định một lớp hoặc phương pháp mới.
- Nên cho phép các đối tượng cha mẹ mở rộng động để các đối tượng con nhìn thấy các thay đổi (nguyên mẫu).
- Nên cho phép chuỗi hàm tạo.
- Phải cho phép các cuộc gọi loại
super
. - Vẫn nên cảm thấy JavaScript-ish.
Ban đầu tôi đã cố gắng để làm việc với đơn giản nguyên mẫu chaining:
function Shape(x,y) {
this.x = x;
this.y = y;
this.draw = function() {
throw new Error("Arbitrary shapes cannot be drawn");
}
}
function Square(x,y,side) {
this.x = x;
this.y = y;
this.side = side;
this.draw = function() {
gotoXY(this.x,this.y); lineTo(this.x+this.side, this.y); ...
}
}
Square.prototype = new Shape();
Và đó giải quyết các yêu cầu 1, 2 và 6 nhưng id không cho phép các cuộc gọi siêu (chức năng mới ghi đè lên chức năng mẹ), nhà xây dựng chaining và mở rộng động một phụ huynh không cung cấp các phương thức mới cho một lớp con.
Mọi đề xuất sẽ được hoan nghênh.
bạn có thể gọi các phương thức siêu. Nếu bạn định nghĩa vẽ trong hình tam giác, bạn có thể lấy siêu vẽ bởi Triangle.prototype.draw –
Vấn đề là phương thức "siêu" không có quyền truy cập vào các trường của đối tượng hiện tại - 'this' là nguyên mẫu chứ không phải' this' của vẽ tranh. Tôi có thể làm 'Square.prototype.draw.apply (điều này, đối số)' nhưng đó là clanky và tôi thường không thích các phương thức gọi class container của chúng theo tên (chúng nên sử dụng 'this' ở khắp mọi nơi). – Guss
và những gì về this.constructor.prototype.draw.apply (điều này, đối số) –