Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Функция Class жива! (https://javascript.ru/forum/offtopic/55353-funkciya-class-zhiva.html)

Erolast 29.04.2015 14:31

Цитата:

какая вообще логическая связь между мапами и созданием приватных полей класса обьяснит кто нибудь?
С мапами - никакой. В WeakMap можно хранить пары "инстанс - набор приватных полей" без утечек памяти.

nondeterminism 29.04.2015 17:39

Цитата:

Сообщение от Erolast
В WeakMap можно хранить пары "инстанс - набор приватных полей" без утечек памяти.

Ну и какие же они приватные, если к ним есть доступ через weakmap?

UIjs 29.04.2015 19:00

Цитата:

Сообщение от Erolast
В WeakMap можно хранить пары "инстанс - набор приватных полей" без утечек памяти.

А, все понял, хммм. можно попробовать, но не вижу причин. В моем способе все хранится в свойстве __privates__ и ни каких проблем нет.

kobezzza 29.04.2015 19:06

UIjs, а почему у тебя нет сахара для protected свойств, т.е. доступ внутри класса и дочерних классов. Это очень удобная абстракция :)

UIjs 29.04.2015 19:15

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

то есть чтобы можно было писать вот так this.protected.say() и надо чтобы this сохранялся, выходит придется биндить при инстанцировании каждого инстанса. но при том если обьект this.protected наследует от this.protected родительского класса, то тогда надо перебиндивать? короче я не совсем понимаю как такое провернуть(

kobezzza 29.04.2015 19:17

Цитата:

Сообщение от UIjs (Сообщение 368738)
kobezzza, потому что это сильная накладка на производительность, их все нужно биндить к каждому инстансу, вот щас Class примерно на 3% медленнее обычных обьектов не наследованых. А как сделать такие же быстрые протектед я не знаю... правда не знаю

то есть чтобы можно было писать вот так this.protected.say() и надо чтобы this сохранялся, выходит придется биндить при инстанцировании каждого инстанса.

Забей, самый простой и наглядный способ:

_myProtectedMethod


Это я так шуткую :)

Цитата:

то есть чтобы можно было писать вот так this.protected.say() и надо чтобы this сохранялся, выходит придется биндить при инстанцировании каждого инстанса. но при том если обьект this.protected наследует от this.protected родительского класса, то тогда надо перебиндивать? короче я не совсем понимаю как такое провернуть(
А нельзя заюзать прокси, чтобы налету проксить нужные вызовы?

UIjs 29.04.2015 19:20

а, точно, че туплю))))))) подчеркивание же и есть протектед просто я могу сделать быстренько переименовывать их убирая подчеркивание а потом снова ставя, это ж вообще не накладно? а как тогда их обьявлять? короче лучше просто подчеркиванием делать и все)

kobezzza 29.04.2015 19:30

Цитата:

есть протектед просто я могу сделать быстренько переименовывать их убирая подчеркивание а потом снова ставя, это ж вообще не накладно?
Это магия, не делай так) Лучше оставь подчеркивание или поиграйся с Proxy, мне кажется там можно прикольно сделать: ловить событие "нет такого метода или свойства" и задавать метод родителя с нужным this.

// Псевдокод
this.protected = {
    __noSuchMethod__: (name, args) => this.super[name].apply(this, args)
};

nondeterminism 29.04.2015 20:07

Цитата:

Сообщение от kobezzza
ловить событие "нет такого метода или свойства" и задавать метод родителя с нужным this.

И причем тут протектед?

UPD Вообще, это и безо всякого прокси можно реализовать.

kobezzza 29.04.2015 21:07

Цитата:

Сообщение от nondeterminism (Сообщение 368748)
И причем тут протектед?

UPD Вообще, это и безо всякого прокси можно реализовать.

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


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