Đây là một phần mở rộng (miễn là chơi chữ) giải pháp của elclanrs để bao gồm chi tiết về các phương pháp thực thể, cũng như thực hiện một cách tiếp cận có thể mở rộng cho khía cạnh đó của câu hỏi; Tôi hoàn toàn thừa nhận rằng điều này được kết hợp lại với nhau nhờ "JavaScript: The Definitive Guide" của David Flanagan (được điều chỉnh một phần cho ngữ cảnh này). Lưu ý rằng điều này rõ ràng là dài dòng hơn các giải pháp khác, nhưng có thể sẽ có lợi về lâu dài.
Đầu tiên, chúng ta sử dụng hàm "mở rộng" đơn giản của David, sao chép các thuộc tính vào một đối tượng được chỉ định:
function extend(o,p) {
for (var prop in p) {
o[prop] = p[prop];
}
return o;
}
Sau đó, chúng tôi triển khai tiện ích định nghĩa Lớp con của anh ấy:
function defineSubclass(superclass,
constructor,
methods,
statics) {
constructor.prototype = Object.create(superclass.prototype);
constructor.prototype.constructor = constructor;
if (methods) extend(constructor.prototype, methods);
if (statics) extend(constructor, statics);
return constructor;
}
Đối với bước chuẩn bị cuối cùng, chúng tôi nâng cao nguyên mẫu Chức năng của mình với jiggery-pokery mới của David:
Function.prototype.extend = function(constructor, methods, statics) {
return defineSubclass(this, constructor, methods, statics);
};
Sau khi xác định lớp Quái vật của chúng ta, chúng ta làm như sau (có thể sử dụng lại cho bất kỳ Lớp mới nào mà chúng ta muốn mở rộng / kế thừa):
var Monkey = Monster.extend(
function Monkey() {
this.bananaCount = 5;
Monster.apply(this, arguments);
},
{
eatBanana: function () {
this.bananaCount--;
this.health++;
this.growl();
}
}
);