Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как работает функция Class (https://javascript.ru/forum/offtopic/33909-kak-rabotaet-funkciya-class.html)

godofjavascript 13.12.2012 19:14

Как работает функция 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

DjDiablo 13.12.2012 19:18

Я уже ненавижу функцию Class.
Если ещё хоть одна сволочь покажет мне как эмитировать классы я его убью к чёрту :-E

godofjavascript 13.12.2012 19:19

Еще один человек думающий что функция Class пытается эмитировать классы из других языков в javascript'е... Тысячи их.. Не обращаем внимание, он не глупый и не "плохой", он просто не читал описание к первым версиям функции. Не судите его строго, его можно понять.

Shaci 13.12.2012 19:23

опять максимус со своими котятами

godofjavascript 13.12.2012 19:26

о, уже кому-то припекло...

DjDiablo 13.12.2012 19:32

Точняк максимальноМинимальный
блин а я повёлся ))

godofjavascript 13.12.2012 19:42

Цитата:

Сообщение от DjDiablo
Я уже ненавижу функцию Class.

Не читай топик, в чем проблема, меня просили написать как она работает - я пишу. Кому интересно - почитают.

Riim 14.12.2012 06:45

this.super как я понял вызывает одноименный (к тому из которого он вызывается) метод?

godofjavascript 14.12.2012 08:32

да), перекрытый родительский, таким образом мы сохраняем старый функционал и еще и расширяем его в дочерних классах.

п.с. напомню что это просто обьяснение того как Class работает, на самом деле там еще немного рющек навешано, и оптимизаций. а также можно менять слово super на какое понравится.

melky 14.12.2012 17:49

навскидку, instanceof не работает ...


Часовой пояс GMT +3, время: 04:07.