В JavaScript у вас нет классов , но вы можете получить наследование и повторное использование поведения разными способами:
Псевдоклассическое наследование (через прототипирование):
function Super () {
this.member1 = 'superMember1';
}
Super.prototype.member2 = 'superMember2';
function Sub() {
this.member3 = 'subMember3';
//...
}
Sub.prototype = new Super();
Должен использоваться с оператором new
:
var subInstance = new Sub();
Применение функции или «построение цепочки»:
function Super () {
this.member1 = 'superMember1';
this.member2 = 'superMember2';
}
function Sub() {
Super.apply(this, arguments);
this.member3 = 'subMember3';
}
Этот подход также следует использовать с оператором new
:
var subInstance = new Sub();
Разница с первым примером состоит в том, что когда мы apply
конструктор Super
к объекту this
внутри Sub
, он добавляет свойства, присвоенные this
в Super
, непосредственно в новом например, например subInstance
содержит свойства member1
и member2
напрямую (subInstance.hasOwnProperty('member1') == true;
).
В первом примере эти свойства достигаются через цепочку прототипов , они существуют во внутреннем объекте [[Prototype]]
.
Паразитарное наследование или конструкторы мощности:
function createSuper() {
var obj = {
member1: 'superMember1',
member2: 'superMember2'
};
return obj;
}
function createSub() {
var obj = createSuper();
obj.member3 = 'subMember3';
return obj;
}
Этот подход основан в основном на "расширении объектов", вам не нужно использовать оператор new
, и, как вы можете видеть, ключевое слово this
не задействовано.
var subInstance = createSub();
ECMAScript 5-е изд. Object.create
метод:
// 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';
Вышеуказанный метод является прототипным методом наследования, предложенным Крокфордом .
Экземпляры объектов наследуются от других экземпляров объектов, вот и все.
Этот метод может быть лучше простого "дополнения объекта", поскольку унаследованные свойства не копируются во все новые экземпляры объекта, поскольку объект base устанавливается как [[Prototype]]
расширенный объект, в приведенном выше примере subInstance
физически содержит только свойство member3
.