Классическое наследование используя .prototype порой слишком "многословно" и хочется использовать что-то попроще и более схожее с другими языками. Факт остаётся фактом что в JS ECMA 5 до сих пор нету классов (ECMA 6 будет и очень приятные, но этого пока нету), используя .prototype их можно симулировать и больше чем просто классы тоже (но это отдельная тема).
Я использовал MooTools и другие библиотеки для классов, но решил замутить свою, со своими плюшками, как обычно изобретение велосипеда - но опыт хороший.
Ссылка:
http://goo.gl/tRdo52
Библиотека позволяет создавать классы и наследовать их, также реализовывать prototype и constructor от других классов либо классических prototype'ов. И дополнительно к этому проверять наследует ли экземпляр другой класс (extends), или имплиментирует ли (implements), и является ли класс самого экземляра конкретным классом (typeof).
Пример работы:
// классический prototype, может быть с наследованием
function Charlie() {
this.delta = 'myDelta';
}
// prototype метод
Charlie.prototype.work = function() {
this.delta += Math.random();
};
// отцовский класс
var Parent = Class.extend({
name: 'Parent',
constructor: function(options) {
this.foo = options.foo || 'no foo!';
},
fooMethod: function() {
return this.foo.toUpperCase();
},
bazMethod: function() {
return this.foo + ' extra text';
}
});
// класс наследует Parent и исплементирует Charlie
var Child = Parent.extend({
name: 'Child',
implement: [ Charlie ],
constructor: function(options) {
this.bar = options.bar || 'no bar!';
},
bazMethod: function(ext) {
// этот метод вызовет метод отцовского класса
return this.super('bazMethod') + ext;
}
});
// экземпляр класса Child
var child = new Child({
foo: 'imFoo'
});
child.fooMethod(); // 'IMFOO'
child.bazMethod(' hey!'); // 'imFoo extra text hey!'
child.delta; // 'myDelta'
child.work(); // добавит произвольное число в поле 'delta'
child.delta; // 'myDelta0.6905072722584009'
child.implements(Charlie); // true
child.extends(Parent); // true
child.typeof(Child); // true