Показать сообщение отдельно
  #1 (permalink)  
Старый 13.12.2012, 19:14
Профессор
Посмотреть профиль Найти все сообщения от godofjavascript
 
Регистрация: 11.12.2012
Сообщений: 265

Как работает функция Class
В этом посте мы рассмотрим пошагово как устроена изнутри всеми нами любимая функция 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

Последний раз редактировалось godofjavascript, 14.12.2012 в 08:52.
Ответить с цитированием