Це розширення (вибачте за каламбур) рішення elclanrs, щоб включити детальну інформацію про методи екземпляра, а також взяти розширюваний підхід до цього аспекту питання; Я цілком визнаю, що це складено завдяки "JavaScript: Вичерпний посібник" Девіда Фланагана (частково з урахуванням цього контексту). Зауважте, що це, очевидно, більш детально, ніж інші рішення, але, ймовірно, виграє в довгостроковій перспективі.
Спочатку ми використовуємо просту функцію Девіда "розширити", яка копіює властивості до вказаного об'єкта:
function extend(o,p) {
for (var prop in p) {
o[prop] = p[prop];
}
return o;
}
Потім ми реалізуємо його утиліту визначення підкласу:
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;
}
В останню частину підготовки ми вдосконалюємо наш прототип Function за допомогою нової хитрості-покери Девіда:
Function.prototype.extend = function(constructor, methods, statics) {
return defineSubclass(this, constructor, methods, statics);
};
Після визначення нашого класу Monster ми робимо наступне (що можна повторно використовувати для будь-яких нових класів, які ми хочемо розширити / успадкувати):
var Monkey = Monster.extend(
function Monkey() {
this.bananaCount = 5;
Monster.apply(this, arguments);
},
{
eatBanana: function () {
this.bananaCount--;
this.health++;
this.growl();
}
}
);