Trong JavaScript, bạn không có các lớp nhưng bạn có thể nhận thừa kế và tái sử dụng hành vi theo nhiều cách:
Kế thừa giả cổ điển (thông qua tạo mẫu):
function Super () {
this.member1 = 'superMember1';
}
Super.prototype.member2 = 'superMember2';
function Sub() {
this.member3 = 'subMember3';
//...
}
Sub.prototype = new Super();
Nên sử dụng với new
toán tử:
var subInstance = new Sub();
Ứng dụng hàm hoặc "chuỗi hàm tạo":
function Super () {
this.member1 = 'superMember1';
this.member2 = 'superMember2';
}
function Sub() {
Super.apply(this, arguments);
this.member3 = 'subMember3';
}
Cách tiếp cận này cũng nên được sử dụng với new
toán tử:
var subInstance = new Sub();
Sự khác biệt với ví dụ đầu tiên là khi chúng ta apply
phương thức Super
khởi tạo cho this
đối tượng bên trong Sub
, nó sẽ thêm các thuộc tính được gán cho this
on Super
, trực tiếp trên thể hiện mới, ví dụ: subInstance
chứa các thuộc tính member1
và member2
trực tiếp ( subInstance.hasOwnProperty('member1') == true;
).
Trong ví dụ đầu tiên, những thuộc tính đó được tiếp cận thông qua chuỗi nguyên mẫu , chúng tồn tại trên một [[Prototype]]
đối tượng bên trong .
Thừa kế ký sinh hoặc Cơ cấu tạo nguồn:
function createSuper() {
var obj = {
member1: 'superMember1',
member2: 'superMember2'
};
return obj;
}
function createSub() {
var obj = createSuper();
obj.member3 = 'subMember3';
return obj;
}
Cách tiếp cận này về cơ bản dựa trên "đối tượng tăng cường", bạn không cần sử dụng new
toán tử và như bạn có thể thấy, this
từ khóa không liên quan.
var subInstance = createSub();
ECMAScript 5 Ed. Object.create
phương pháp:
// Check if native implementation available
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {} // empty constructor
F.prototype = o; // set base object as prototype
return new F(); // return empty object with right [[Prototype]]
};
}
var superInstance = {
member1: 'superMember1',
member2: 'superMember2'
};
var subInstance = Object.create(superInstance);
subInstance.member3 = 'subMember3';
Phương pháp trên là một kỹ thuật kế thừa nguyên mẫu do Crockford đề xuất .
Các thể hiện đối tượng kế thừa từ các thể hiện đối tượng khác, thế là xong.
Kỹ thuật này có thể tốt hơn so với đơn giản "đối tượng tăng thêm" vì tài sản thừa kế không được sao chép trên tất cả các trường hợp đối tượng mới, kể từ khi cơ sở đối tượng được thiết lập như là [[Prototype]]
của mở rộng đối tượng, trong ví dụ trên subInstance
có chứa chất chỉ là member3
bất động sản.