Тема: class.js
Показать сообщение отдельно
Старый 21.12.2013, 21:19   #1
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
class.js

Классическое наследование используя .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 
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
ABTOMAT (22.12.2013), pax (22.12.2013), Phantom (22.12.2013)