В 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';
Вышеупомянутый метод является прототипной техникой наследования, предложенной Крокфордом .
Экземпляры объектов наследуются от других экземпляров объекта, вот и все.
Этот метод может быть лучше , чем просто «объект увеличения» , потому что наследственные свойства не копируются все новые экземпляры объектов, так как базовая объект установлен как [[Prototype]]
часть расширенного объекта, в приведенном выше примере , subInstance
содержит физически только member3
свойство.