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

B~Vladi 25.07.2012 17:28

Цитата:

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

Ну ок.

Тогда следующее тролль-предложение: объединить доп. параметры с "прототипом". Т.к. это и не совсем прототип, из-за свойства constructor, то и доп. параметры вполне неплохо туда впишутся.

devote 25.07.2012 17:39

Цитата:

Сообщение от B~Vladi
объединить доп. параметры с "прототипом".

а вот это я пока не знаю как реализовать, так как данные в прототипе, не доступны до тех пор пока не будет создан экземпляр класса. И вытащить из него что-то будет тяжко в том случае если его передадут таким образом:
Class("Foo", function() { // функция врапер
    var private = "1";
    return {
        __extends: "Bar",
        constructor: function() {
        }
    }
});
вот параметр __extends мне не будет доступен в момент объявления класса, так как он будет завернут в функцию, а что бы его получить придется инициализировать приватные параметры. То-есть вызвать функции врапер. что не есть гуд, потому как я вызываю его лишь когда создают экземпляр

B~Vladi 25.07.2012 17:51

Цитата:

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

Ок, понятно. Если нужна поддержка функции-враппера, то да.

x-yuri 25.07.2012 18:52

Цитата:

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

Говоря прямо, я о тебе забочусь ;) и тех кто решит заглянуть в исходник

Цитата:

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

В vim никуда мотать не надо будет, в идеале, я могу переместиться в конец класса с помощью одного нажатия клавиши. Все зависит от того, где курсор расположен. Что же касается расположения параметра с опциями, я бы все же на втором месте его расположил. Два варианта вызова - это не так сложно, по сравнению с 12-ю. Разве что не мешал бы статические свойства и опции (см. выше).

Цитата:

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

А почему только при создании? Почему бы не вызвать его один раз при объявлении и запомнить полученную информацию?

devote 25.07.2012 19:07

Цитата:

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

Ну там с эти проблем вроде как нету.

Цитата:

Сообщение от x-yuri
Разве что не мешал бы статические свойства и опции (см. выше).

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

Цитата:

Сообщение от x-yuri
Почему бы не вызвать его один раз при объявлении и запомнить полученную информацию?

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

x-yuri 25.07.2012 22:21

Цитата:

Сообщение от devote
но ведь опций не так много, разве это может навредить?

Получается, что в параметра хранится 2 вида информации: опции и статические свойства. Хотя бы, как назвать такой параметр? optionsAndStaticData?

Цитата:

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

Получается,

1. Ты сам создаешь конструктор, который вызывает сначала функцию-обертку, а потом конструктор указанный пользователем? Другими словами функция-обертка - часть конструктора?

2. Попытавшись просмотреть код конструктора, я получу код твоей функции, а не той, которую я передал в Class?

devote 25.07.2012 23:36

Цитата:

Сообщение от x-yuri
Хотя бы, как назвать такой параметр? optionsAndStaticData?

над этим я еще подумаю конечно.

Цитата:

Сообщение от x-yuri
1. Ты сам создаешь конструктор, который вызывает сначала функцию-обертку, а потом конструктор указанный пользователем? Другими словами функция-обертка - часть конструктора?

можно сказать и так, поэтому встроенный instanceof не работает с этими классами, это в первую очередь идут проблем из ИЕ, так как там юзаем VB и он то нам и выдает кучу гемора. Вот поэтому Class.Foo.prototype.constructor не является тем что хотелось бы ожидать.

Цитата:

Сообщение от x-yuri
Попытавшись просмотреть код конструктора, я получу код твоей функции, а не той, которую я передал в Class?

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

devote 26.07.2012 08:47

Очередное обновление, сделал так как предложил x-yuri,
Class("Foo", {
    context: window,
    extends: "Bar",
    implements: [ "IBase", "IPersistent" ],
    static: {
        STATIC_PARAM: 1,
        STATIC_CONST: "lala"
    }
}, {
    // code
});

x-yuri 27.07.2012 00:22

Цитата:

Сообщение от devote
можно сказать и так, поэтому встроенный instanceof не работает с этими классами, это в первую очередь идут проблем из ИЕ, так как там юзаем VB и он то нам и выдает кучу гемора. Вот поэтому Class.Foo.prototype.constructor не является тем что хотелось бы ожидать.

А в чем прикол двух-конструкторов? При чем первый (обертка) ведь не имеет доступа к параметрам вызова.

devote 27.07.2012 00:32

Цитата:

Сообщение от x-yuri
А в чем прикол двух-конструкторов?

дык двух и нет, есть один конструктор который строит экземпляр, назначает аксессоры, и т.д. а второй по сути тот что ты объявишь/не объявишь в своем классе. То есть обертка, нужна лишь в том случае если хочешь сделать приватные свойства, которые будут распространятся лишь на экземпляр, тоесть на каждый экземпляр свои переменные.


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