Nếu bạn đã làm Object Oriented Programming trong JavaScript, bạn sẽ biết rằng bạn có thể tạo ra một lớp như sau:
Person = function(id, name, age){
this.id = id;
this.name = name;
this.age = age;
alert('A new person has been accepted');
}
Cho đến nay lớp học của chúng tôi chỉ có hai tài sản và chúng tôi sẽ cung cấp cho nó một số phương pháp. Cách làm sạch là để sử dụng đối tượng 'nguyên mẫu' của nó. Bắt đầu từ JavaScript 1.1, đối tượng nguyên mẫu được giới thiệu trong JavaScript. Đây là một đối tượng được xây dựng trong đó đơn giản hóa quá trình thêm thuộc tính và phương thức tùy chỉnh vào tất cả các phiên bản của đối tượng. Hãy thêm 2 phương pháp để lớp của chúng tôi sử dụng đối tượng 'nguyên mẫu' của nó như sau:
Person.prototype = {
/** wake person up */
wake_up: function() {
alert('I am awake');
},
/** retrieve person's age */
get_age: function() {
return this.age;
}
}
Bây giờ chúng ta đã xác định Person lớp của chúng tôi. Điều gì sẽ xảy ra nếu chúng ta muốn định nghĩa một lớp khác được gọi là Trình quản lý kế thừa một số thuộc tính từ Person. Không có điểm nào xác định lại tất cả các thuộc tính này một lần nữa khi chúng ta định nghĩa lớp Manager, chúng ta có thể thiết lập nó để kế thừa từ lớp Person. JavaScript không đã xây dựng trong kế thừa nhưng chúng ta có thể sử dụng một kỹ thuật để thực hiện quyền thừa kế như sau:
Inheritance_Manager = {};
// Chúng tôi tạo ra một lớp quản lý thừa kế (tên là tùy ý)
Bây giờ chúng ta hãy cung cấp cho lớp kế thừa của chúng tôi một phương thức được gọi là extend, lấy các đối số baseClass và subClassas. Trong phương thức mở rộng, chúng ta sẽ tạo một lớp bên trong được gọi là thừa kế hàm thừa kế() {}. Lý do tại sao chúng ta đang sử dụng lớp bên trong này là để tránh nhầm lẫn giữa các nguyên mẫu baseClass và subClass. Tiếp theo, chúng ta tạo nguyên mẫu của điểm lớp kế thừa của chúng ta thành nguyên mẫu baseClass như sau: inheritance.prototype = baseClass. nguyên mẫu; Sau đó, chúng ta sao chép mẫu thử nghiệm kế thừa vào nguyên mẫu subClass như sau: subClass.prototype = new inheritance(); Điều tiếp theo là xác định hàm tạo cho lớp con của chúng ta như sau: subClass.prototype.constructor = subClass; Sau khi kết thúc với việc tạo mẫu con SubClass, chúng ta có thể chỉ định hai dòng mã tiếp theo để thiết lập một số con trỏ lớp cơ sở.
subClass.baseConstructor = baseClass;
subClass.superClass = baseClass.prototype;
Đây là mã đầy đủ cho chức năng mở rộng của chúng tôi:
Inheritance_Manager.extend = function(subClass, baseClass) {
function inheritance() { }
inheritance.prototype = baseClass.prototype;
subClass.prototype = new inheritance();
subClass.prototype.constructor = subClass;
subClass.baseConstructor = baseClass;
subClass.superClass = baseClass.prototype;
}
Bây giờ chúng ta đã thực hiện thừa kế của chúng tôi, chúng ta có thể bắt đầu sử dụng nó để mở rộng các lớp học của chúng tôi. Trong trường hợp này chúng ta sẽ mở rộng lớp người chúng tôi vào một lớp học quản lý như sau:
Chúng ta định nghĩa lớp Manager
Manager = function(id, name, age, salary) {
Person.baseConstructor.call(this, id, name, age);
this.salary = salary;
alert('A manager has been registered.');
}
chúng ta làm cho nó kế thừa hình thức Person
Inheritance_Manager.extend(Manager, Person);
Nếu bạn chú ý, chúng ta vừa gọi phương thức extend của lớp Inheritance_Manager của chúng ta và thông qua subClass Manager trong trường hợp của chúng ta và sau đó là baseClass Person. Lưu ý rằng thứ tự rất quan trọng ở đây. Nếu bạn hoán đổi chúng, thừa kế sẽ không hoạt động như bạn dự định nếu có. Cũng lưu ý rằng bạn sẽ cần phải xác định thừa kế này trước khi bạn thực sự có thể xác định subClass của chúng tôi. Bây giờ, hãy xác định subClass của chúng tôi:
Chúng tôi có thể thêm các phương thức khác làm phương thức bên dưới. Lớp Manager của chúng ta sẽ luôn có các phương thức và thuộc tính được định nghĩa trong lớp Person bởi vì nó kế thừa từ nó.
Manager.prototype.lead = function(){
alert('I am a good leader');
}
Bây giờ để kiểm tra nó cho phép chúng ta tạo ra hai đối tượng, một từ Person lớp và một từ lớp Manager thừa hưởng:
var p = new Person(1, 'Joe Tester', 26);
var pm = new Manager(1, 'Joe Tester', 26, '20.000');
Hãy thoải mái để lấy mã đầy đủ và bình luận chi tiết tại: http://www.cyberminds.co.uk/blog/articles/how-to-implement-javascript-inheritance.aspx
Cách bạn sử dụng nó gần như đúng nhưng bạn có thể muốn sử dụng Object.create() thay vì khởi tạo cơ sở bằng từ khóa mới (có thể gây ra vấn đề nếu hàm tạo cơ sở cần đối số). Tôi có thông tin chi tiết trên blog của mình: http://ncombo.wordpress.com/2013/07/11/javascript-inheritance-done-right/ – Jon
Cũng lưu ý rằng Product() được gọi hiệu quả hai lần. –