Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Использование классов в JavaScript (https://javascript.ru/forum/project/27339-ispolzovanie-klassov-v-javascript.html)

x-yuri 27.07.2012 01:22

Цитата:

Сообщение от devote
дык двух и нет, есть один конструктор который строит экземпляр, назначает аксессоры, и т.д. а второй по сути

ну-ну :) Их вообще три, если на то пошло: один твой и два пользовательских. Ну т.е. я так понял конструктор-обертка - для приватных свойств экземпляра. На мой взгляд толку от приватных свойств мало, больше вреда, если к ним вдруг извне понадобилось получить доступ: банально при отладке, или может быть для тестов. Но будем считать, что я этого не говорил... :)

B~Vladi 27.07.2012 09:49

Цитата:

Сообщение от x-yuri
На мой взгляд толку от приватных свойств мало, больше вреда

Согласен.

devote 27.07.2012 10:20

Цитата:

Сообщение от x-yuri
На мой взгляд толку от приватных свойств мало, больше вреда, если к ним вдруг извне понадобилось получить доступ: банально при отладке, или может быть для тестов. Но будем считать, что я этого не говорил...

спорить не будут, в чем то ты и прав, но это все равно что говорить, зачем изоляция на проводах, ведь и без нее провода могут делать то что делают. И к любому свойству при желании можно получить доступ. Но тут все же есть и плюсы, да я понимаю что открыв исходник можно и приватные свойства открыть. Но это лишь временное решение, до первого обновления, да и защита от дурака. Если давать людям все поголовно, то и тупых вопросов будет на тех же форумах и т.д. А так ты просто избавляешь себя от нападения вопросов. Банально простой пример, открыв свойство тебя спросят что это. А закрыв никто не спросит.

Но это мое ИМХО, и если все же приватные свойства были бы не к чему, их бы не использовали бы нигде.

x-yuri 27.07.2012 12:09

Есть такая штука как, назовём это, приватность по соглашению:
Class('MyClass', {
    myPublicMethod: function() {...},
    _myPrivateMethod: function() {...}

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

Цитата:

Сообщение от devote
Но это мое ИМХО, и если все же приватные свойства были бы не к чему, их бы не использовали бы нигде.

Обычно их используют, потому что есть такая возможность. Актуально же, думаю, в случае невменяемости сотрудников.

devote 29.01.2013 16:00

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

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

Что нового?
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

devote 29.01.2013 16:12

В пост выше, добавил рисунок структуры объекта, получившегося в отладчике Dragonfly.

x-yuri 30.01.2013 14:02

Цитата:

Сообщение от devote
спорить не будут, в чем то ты и прав, но это все равно что говорить, зачем изоляция на проводах, ведь и без нее провода могут делать то что делают.

Безусловно, какая-то защита от дурака должна присутствовать. Но ее можно значительно снизить, выбирая окружение.

devote 30.01.2013 14:36

x-yuri,
решил спустя пол года ответить на пост?)))

x-yuri 30.01.2013 18:03

ну ты ж вчера воскресил тему, вот я и наткнулся на твою фразу ;)

devote 30.01.2013 18:52

Цитата:

Сообщение от x-yuri
вот я и наткнулся на твою фразу

странно что ранее на нее не ответил, хотя ты ее видел ранее


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