Показать сообщение отдельно
  #65 (permalink)  
Старый 29.01.2013, 16:00
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Всем снова привет!

Сегодня влил новую стабильную версию библиотеки. В новой версии были внесены некоторые изменения и нововведения.

Что нового?
1. Была переработана система наследования, теперь множественное наследование это, все равно что обычное наследование.
2. Была введена отдельная инкапсуляция для аксессоров.
3. Теперь конструкторы можно называть именем класса.

Что изменилось?
1. Теперь контекст классов по умолчанию всегда глобальный.
1. Теперь при обращении к аксессору не имеющего getter'а срабатывает исключение, то же самое и с setter'ом.

Эти добавления и изменения заставили переписать систему построения наследования почти с нуля. Так же это сказалось на оптимизации, скорость построения классов увеличилась, размер кода остался почти без изменений (то есть мне удалось внести нововведения и изменения без огромного увеличения размера библиотеки).

Примеры:
  • Множественное наследование
    /**
     * @class Foo
     */
    Class("Foo", {
        /**
         * @constructor
         * @constructs
         */
        Foo: function() {
            alert("Executed constructor: " + this.__class__.className);
        }
    });
    
    /**
     * @class Bar
     * @extends Foo
     */
    Class("Bar", "Foo", { // наследуем от Foo
        /**
         * @constructor
         * @constructs
         */
        Bar: function() {
            this.parent.constructor();
            alert("Executed constructor: " + this.__class__.className);
        }
    });
    
    /**
     * @class Biz
     */
    Class("Biz", {
        /**
         * @constructor
         * @constructs
         */
        Biz: function() {
            alert("Executed constructor: " + this.__class__.className);
        }
    });
    
    /**
     * @class Baz
     * @extends Biz
     */
    Class("Baz", "Biz", {
        /**
         * @constructor
         * @constructs
         */
        Baz: function() {
            this.parent.constructor();
            alert("Executed constructor: " + this.__class__.className);
        }
    });
    
    
    /**
     * @class Mix
     * @extends Bar
     * @implements Baz
     */
    Class("Mix", "Bar, Baz", {
        /**
         * @constructor
         * @constructs
         */
        Mix: function() {
            this.parent.constructor();
            alert("Executed constructor: " + this.__class__.className);
    
            // вызываем коструктор класса указанного в параметре implements
            this.Baz();
        }
    });
    
    var obj = new Mix(); // alerts Foo, Bar, Mix, Biz, Baz
    

    Структура в отладчике:


  • отдельная инкапсуляция для аксессоров
    /**
     * @class Foo
     */
    Class("Foo", {
    
        /**
         * @type {String}
         * @property
         * @public
         */
        name: {
            // инкапсуляция
            value: "DefaultValue", // снаружи нет доступа к этому значению
    
            set: function(value, self) { // self это ссылка на объект свойства name
                self.value = value;
            },
            get: function(self) {
                return self.value;
            }
        }
    });
    
    var obj = new Foo();
    alert(obj.name); // alerts "DefaultValue"
    
    obj.name = "NewValue"; // executed setter
    
    alert(obj.name); // alerts "NewValue"
    
  • конструкторы можно называть именем класса.
    Это вы уже увидели из примеров выше

Основную документацию вы найдете в первом топике этой темы.

На любые вопросы с большим удовольствием отвечу. Пожелания, выслушаю. Всем спасибо!

Скачать как всегда тут: https://github.com/devote/jsClasses
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 29.01.2013 в 18:16.
Ответить с цитированием