Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 13.12.2012, 19:18
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Я уже ненавижу функцию Class.
Если ещё хоть одна сволочь покажет мне как эмитировать классы я его убью к чёрту
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Ответить с цитированием
  #3 (permalink)  
Старый 13.12.2012, 19:19
Профессор
Посмотреть профиль Найти все сообщения от godofjavascript
 
Регистрация: 11.12.2012
Сообщений: 265

Еще один человек думающий что функция Class пытается эмитировать классы из других языков в javascript'е... Тысячи их.. Не обращаем внимание, он не глупый и не "плохой", он просто не читал описание к первым версиям функции. Не судите его строго, его можно понять.
Ответить с цитированием
  #4 (permalink)  
Старый 13.12.2012, 19:23
Аватар для Shaci
:-/
Отправить личное сообщение для Shaci Посмотреть профиль Найти все сообщения от Shaci
 
Регистрация: 28.09.2009
Сообщений: 1,126

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

о, уже кому-то припекло...
Ответить с цитированием
  #6 (permalink)  
Старый 13.12.2012, 19:32
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Точняк максимальноМинимальный
блин а я повёлся ))
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Ответить с цитированием
  #7 (permalink)  
Старый 13.12.2012, 19:42
Профессор
Посмотреть профиль Найти все сообщения от godofjavascript
 
Регистрация: 11.12.2012
Сообщений: 265

Сообщение от DjDiablo
Я уже ненавижу функцию Class.
Не читай топик, в чем проблема, меня просили написать как она работает - я пишу. Кому интересно - почитают.
Ответить с цитированием
  #8 (permalink)  
Старый 14.12.2012, 06:45
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

this.super как я понял вызывает одноименный (к тому из которого он вызывается) метод?
Ответить с цитированием
  #9 (permalink)  
Старый 14.12.2012, 08:32
Профессор
Посмотреть профиль Найти все сообщения от godofjavascript
 
Регистрация: 11.12.2012
Сообщений: 265

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

п.с. напомню что это просто обьяснение того как Class работает, на самом деле там еще немного рющек навешано, и оптимизаций. а также можно менять слово super на какое понравится.
Ответить с цитированием
  #10 (permalink)  
Старый 14.12.2012, 17:49
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать какая функция вызывается в браузере при наведении мыши? Бобр Элементы интерфейса 6 01.10.2012 04:01
Неверно работает OnBlur и, как следствие - OnFocus motoriton Firefox/Mozilla 0 10.08.2012 09:06
как повесить на событие функция класса Hugo_O Общие вопросы Javascript 14 06.11.2010 02:09
Не работает функция из подключаемого файла evgenyan jQuery 3 28.10.2010 14:48
Ajax и три <form> не работает. Как правильно сделать листание записей из базы данных? vlad275 AJAX и COMET 2 14.12.2009 14:04