Nếu bạn đã thực hiện Lập trình hướng đối tượng trong JavaScript, bạn sẽ biết rằng bạn có thể tạo 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 class person của chúng ta chỉ có hai thuộc tính và chúng ta sẽ cung cấp cho nó một số phương thức. Một cách rõ ràng để làm điều này 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 sẵn giúp đơn giản hóa quá trình thêm các thuộc tính và phương thức tùy chỉnh vào tất cả các trường hợp của một đối tượng. Hãy thêm 2 phương thức vào lớp của chúng ta bằng cách sử dụng đối tượng 'nguyên mẫu' của nó như sau:
Person.prototype = {
wake_up: function() {
alert('I am awake');
},
get_age: function() {
return this.age;
}
}
Bây giờ chúng ta đã định nghĩa lớp Person của chúng ta. Đ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à Manager kế thừa một số thuộc tính từ Person. Không có ích gì khi xác định lại tất cả các thuộc tính này khi chúng ta định nghĩa lớp Manager của mình, chúng ta chỉ có thể đặt nó kế thừa từ lớp Person. JavaScript không được tích hợp sẵn tính kế thừa nhưng chúng ta có thể sử dụng một kỹ thuật để triển khai kế thừa như sau:
Inheritance_Manager = {};
// Chúng tôi tạo một lớp quản lý kế thừa (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 ta một phương thức có tên là extension 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à kế thừa hàm kế thừa () {}. Lý do tại sao chúng tôi 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 làm cho nguyên mẫu của lớp kế thừa của chúng ta trỏ đến nguyên mẫu baseClass như với đoạn mã sau: inherit.prototype = baseClass. nguyên mẫu; Sau đó, chúng ta sao chép nguyên mẫu kế thừa vào nguyên mẫu subClass như sau: subClass.prototype = new inherit (); Điều tiếp theo là chỉ định phương thức khởi tạo cho SubClass của chúng ta như sau: subClass.prototype.constructor = subClass; Sau khi hoàn thành việc tạo mẫu lớp con, chúng ta có thể chỉ định hai dòng mã tiếp theo để đặt 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 kế thừa của mình, chúng ta có thể bắt đầu sử dụng nó để mở rộng các lớp của mình. Trong trường hợp này, chúng tôi sẽ mở rộng lớp Người của chúng ta thành lớp Người quản lý như sau:
Chúng tôi xác định lớp Người quản lý
Manager = function(id, name, age, salary) {
Person.baseConstructor.call(this, id, name, age);
this.salary = salary;
alert('A manager has been registered.');
}
chúng tôi làm cho nó hình thức kế thừa Person
Inheritance_Manager.extend(Manager, Person);
Nếu bạn nhận thấy, chúng tôi vừa gọi phương thức mở rộng của lớp Inheritance_Manager và chuyển Trình quản lý lớp con trong trường hợp của chúng tôi và sau đó là Người thuộc lớp cơ sở. Lưu ý rằng thứ tự rất quan trọng ở đây. Nếu bạn hoán đổi chúng, tài sản thừa kế sẽ không hoạt động như bạn dự định. Cũng lưu ý rằng bạn sẽ cần chỉ định sự kế thừa này trước khi bạn thực sự có thể xác định Lớp con của chúng ta. Bây giờ chúng ta hãy xác định SubClass của chúng ta:
Chúng ta có thể thêm nhiều phương pháp như 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 vì nó kế thừa từ nó.
Manager.prototype.lead = function(){
alert('I am a good leader');
}
Bây giờ để kiểm tra nó, chúng ta hãy tạo hai đối tượng, một từ lớp Person và một từ người quản lý lớp kế thừa:
var p = new Person(1, 'Joe Tester', 26);
var pm = new Manager(1, 'Joe Tester', 26, '20.000');
Vui lòng nhận toàn bộ mã và thêm nhận xét tại:
http://www.cyberminds.co.uk/blog/articles/how-to-implement-javascript-inheritance.aspx