В этом посте мы рассмотрим пошагово как устроена изнутри всеми нами любимая функция Class.
Вначале я создал красивую обертку под описание классов:
function Class(Prototype) {
function Class() {
/** @namespace this.__construct */
if (this.__construct)this.__construct.apply(this, arguments)
}
Class.prototype = new Prototype;
return Class
}
var Cat = new Class(function () {
this.__construct = function (name) {
this.name = name || 'Neo';
};
this.say = function () {
alert(this.name)
};
});
new Cat().say();
Благодаря чему теперь можно описывать свойства методы и конструктор все в одном изолированном месте и ни чего больше не болтается)
Потом я добавил возможность добавлять классу статические свойства(8 строчка):
function Class(Prototype) {
function Class() {
/** @namespace this.__construct */
if (this.__construct)this.__construct.apply(this, arguments)
}
Class.prototype = new Prototype(Class);
return Class
}
var Cat = new Class(function (Cat) {
Cat.ololo = 11;
});
alert(Cat.ololo);
Далее я добавил возможность классам наследоваться друг от друга(9 строчка):
function Class(Prototype, superclass) {
function Class() {
/** @namespace this.__construct */
if (this.__construct)this.__construct.apply(this, arguments)
}
if (superclass) Prototype.prototype = superclass.prototype;
Class.prototype = new Prototype(Class);
return Class
}
var Animal = new Class(function () {
this.run = function () { alert('run') };
});
var Cat = new Class(function () {
this.jump = function () { alert('jump') };
}, Animal);
new Cat().run();
new Cat().jump();
Потом я добавил возможность обращения к перекрытым методам через this.super(12-26 строчка):
function Class(Prototype, superclass) {
function Class() {
/** @namespace this.__construct */
if (this.__construct)this.__construct.apply(this, arguments)
}
if (superclass) Prototype.prototype = superclass.prototype;
Class.prototype = new Prototype(Class);
if (superclass) for (var key in Class.prototype)
if (Class.prototype.hasOwnProperty(key)
&& key in Prototype.prototype
&& Class.prototype[key] instanceof Function
&& Prototype.prototype[key] instanceof Function)
{
Class.prototype[key] = (function (key) {
var method = Class.prototype[key];
return function () {
this.super = Prototype.prototype[key];
return method.apply(this, arguments)
}
})(key)
}
return Class
}
var Animal = new Class(function () {
this.run = function () {
alert('run')
};
});
var Cat = new Class(function () {
this.run = function () {
this.super();
alert('...and jump')
};
}, Animal);
new Cat().run();
ВСЁ)) А больше ни чего и не нужно) дальше уже ваша фантазия что с этим делать. Шаблоны того как я этим работать и зачем это вообще нужно я уже предлагал) Кто прочел, тот молодец.
-----------------------------------------------------
Почему я сделал
var Ololo = new Class(function(){ });
а не
var Ololo = Class.extends(function(){ });
Потому что
new Class очевиднее чем
Class.extends или
Ololo.extends