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

Erolast 28.04.2015 11:34

Цитата:

и получить утечки памяти?
Откуда там утечки?
Да, конечно же, я имел в виду свойства.

Цитата:

Да какая разница доступно свойство или нет, private и protected - это удобные слои абстракции, а не "защита от злобных хакеров", поэтому нет смысла заморачиваться с "безопасностью".
Бывает, что свойство должно изменяться только при определенных обстоятельствах, и, будучи открытым, станет рычагом для поломки кода, что как-то некрасиво.

nerv_ 28.04.2015 11:40

Цитата:

Сообщение от Erolast
Откуда там утечки?

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

Erolast 28.04.2015 11:42

Цитата:

если явно не вызывать деструктор, который будет удалять данные об экземпляре объекта из WeakMap, то они будут там лежать
Почему? Это ж как раз фишка WeakMap, что ссылки в его ключах не учитываются при сборке мусора.

kobezzza 28.04.2015 13:01

Цитата:

Бывает, что свойство должно изменяться только при определенных обстоятельствах, и, будучи открытым, станет рычагом для поломки кода, что как-то некрасиво.
Для такого кейза правильнее использовать get / set методы.

UIjs 28.04.2015 13:45

вот записал про наследование для тех кто не в курсе для чего оно, ну и за одно про юишку)

https://www.youtube.com/watch?v=FWc8-dsFKOw

UIjs 28.04.2015 13:48

брин ребят не несите хурню, суть приватных полей класса - ИЗБЕЖАТЬ КОФЛИКТ ИМЕН и ИНКАПСУЛЯЦИЯ. обе цели у меня реализованы. точка.

викмапы какие то придумывают блин kobezzza, обуздай пасанов близ а то у меня время нет)

nerv_ 28.04.2015 14:04

Цитата:

Сообщение от Erolast
Почему? Это ж как раз фишка WeakMap, что ссылки в его ключах не учитываются при сборке мусора.

похоже на то
Я не пользовался WeakMap/WeakSet т.к. не вижу в них необходимости =)

kobezzza 28.04.2015 14:27

Цитата:

викмапы какие то придумывают блин kobezzza, обуздай пасанов близ а то у меня время нет)
:D

Цитата:

Я не пользовался WeakMap/WeakSet т.к. не вижу в них необходимости =)
Зря ты так, офигенная вещь, допустим в качестве ключа у нас объект соединения пользователя (ну т.е. на серваке), клиент отрубился и если на его объект соединения нет других ссылок, то он автоматом грохнется из WeakMap.

Или другой пример: в качестве ключа выступает DOM нода, а в значении мы храним свою полезную инфу, и когда ноду грохнут, то она автоматом грохнется из WeakMap, т.е. это более правильный подход чем расширения ноды своими свойствами, т.к. нет проблемы конфликта имён.

Разумеется также есть Map / Set, которые в отличии от Weak аналогов итерабельны (причём с сохранением порядка вставки), но там память сама уже не чистится.

l-liava-l 28.04.2015 23:30

Цитата:

Зря ты так, офигенная вещь, допустим в качестве ключа у нас объект соединения пользователя (ну т.е. на серваке), клиент отрубился и если на его объект соединения нет других ссылок, то он автоматом грохнется из WeakMap.

Или другой пример: в качестве ключа выступает DOM нода, а в значении мы храним свою полезную инфу, и когда ноду грохнут, то она автоматом грохнется из WeakMap, т.е. это более правильный подход чем расширения ноды своими свойствами, т.к. нет проблемы конфликта имён.

Разумеется также есть Map / Set, которые в отличии от Weak аналогов итерабельны (причём с сохранением порядка вставки), но там память сама уже не чистится.
Еще викмапы и просто мапы удобно юзать чтобы делать двустороннее связывание между двумя разными моделями.

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

UIjs 29.04.2015 14:19

Цитата:

Сообщение от l-liava-l
Еще викмапы и просто мапы удобно юзать чтобы делать двустороннее связывание между двумя разными моделями.

Они для этого и предназначены, умник. Чтобы всякие кеширования делать и.т.п.


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

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 Вообще, это и безо всякого прокси можно реализовать.

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

nondeterminism 29.04.2015 21:16

Цитата:

Сообщение от kobezzza
Прокси экономят память и не занимают времени при инициализации объекта

Внезапно, обычные прототипы делают то же самое

nondeterminism 29.04.2015 21:19

kobezzza,
Вообще, в целом, ты пытаешься засунуть Proxy туда, для чего они не предназначены. Я против Proxy ничего не имею, просто назначение у них несколько иное. Это, в первую очередь -- инструмент метапрограммирования.

kobezzza 29.04.2015 21:21

Цитата:

Сообщение от nondeterminism (Сообщение 368756)
Внезапно, обычные прототипы делают то же самое

И как ты на прототипах сделаешь чтобы this в this.protected.foo() ссылался на наш объекта, а не на this.protected без биндингов или явных указаний?

Хотя в кошерном ES7 можно будет просто написать:

this::protected.foo() // protected.foo.call(this)


Таска на добавление в Babel уже висит :)

nondeterminism 29.04.2015 21:35

Цитата:

Сообщение от kobezzza
чтобы this в this.protected.foo()

Я не совсем понял задачу. this вообще не может никуда ссылаться, он динамически связывается. Что ты тут под protected подразумеваешь, тоже не вполне понятно. В JS, насколько мне известно, его можно реализовать только лексическими замыканиями.
Короче, опиши задачу четче.

kobezzza 29.04.2015 21:50

Вот валидный и рабочий пример на ES7 (Babel)

class Base {
    name = 'Hello World';

    protected = {
        getName() {
            return this.name;
        }
    };

    constructor() {
        this.protected = new Proxy(this.protected, {
            get: (target, name) => {
                return target[name].bind(this);
            }
        });
    }
}

class Child extends Base {
    constructor() {
        super();
        console.log(this.protected.getName()); // Hello World
    }
}

new Child();


Babel песочница

Цитата:

Что ты тут под protected подразумеваешь, тоже не вполне понятно.
Методы и свойства доступные внутри класса и его потомков, но закрытые наружу.

nondeterminism 29.04.2015 21:51

kobezzza,
O=function(){
 var protected_=10
 return {
 create: function(){return Object.create(this)},
 get: function(){return protected_},
 set: function(value){protected_=value}
 } 
}()


o=O.create()
console.log(o.get())
o.set(100)
console.log(o.get())

//>>>> 10
//>>>> 100

kobezzza 29.04.2015 21:55

И как в твоём примере доопределять методы в дочерних классах, как решается конфликт имён, как вводить новые свойства и методы не из замыкания, как сделать нормальный синтаксис, а не то сраное говно, которое ты написал?

PS: только сейчас я понял, что спорю с Foo, поэтому прекращаю это занятие.

UIjs 30.04.2015 10:25

Цитата:

Сообщение от kobezzza
поиграйся с Proxy

прокси опять же, производительность, нужно максимаально нативно все сделать

Цитата:

Сообщение от nondeterminism
засунуть Proxy туда, для чего они не предназначены

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


Цитата:

Сообщение от nondeterminism
this вообще не может никуда ссылаться, он динамически связывается. Что ты тут под protected подразумеваешь, тоже не вполне понятно. В JS, насколько мне известно, его можно реализовать только лексическими замыканиями.

слишком толсто несешь ахинею, попробуй потоньше, попробуй добавтить больше связи между словами, тогда мож кто и клюнет, а так просто набор терминов

kobezzza, не ну по сути закрытость внаружу дает неймспейс.
Так что просто между this.protected.method и this.protectedMethod разница не особая) , все лучший вариант уже обозначен. неймспейс _ . я вспомнил, когда я пилил Class я решил что это и есть протектет и сахар для этого не обязательно.

Цитата:

Сообщение от kobezzza
спорю с Foo

эт типа мне сменка пришла)?

kobezzza 30.04.2015 11:24

Цитата:

прокси опять же, производительность, нужно максимаально нативно все сделать
Ну ты же можешь при первом вызове кешировать вызов и дальше он уже не через прокси будет крутится, хотя это больше рассуждения вслух, вариант с _ самый лучший пока не сделают нативную поддержку)

Цитата:

эт типа мне сменка пришла)?
Угу :)

UIjs 30.04.2015 11:32

Цитата:

Сообщение от kobezzza
Ну ты же можешь при первом вызове кешировать вызов

я могу это и геттерами сделать), просто обьект this.protected наследую от Class.prototype и в this.protected вешаю геттеры, которые при обращении создадут забиндиную протектед функцию из Class.prototype и заменят геттер на значение этой функции. хм, можно угарнуть, а обьявлять их как и где? надо чтобы и на кофи работало и на яваскрипте и норм смотрелось)

UIjs 05.05.2015 15:08

писать фильтры на кофескрипте одно удовольствие, и ни какой ES6 не сравнится)




UIjs 10.05.2015 19:27

круто придумал))

вешается на Class.prorotype.parent геттер и когда запрашиваем это свойство то нам известно this из которого запрашивается это свойство, дальше мы запоминаем этот this. а в parent лежат функции обертки которые вызывают оригинальные родительские методы в контексте этого запомннеого текущего this который где то там хранится. и все)

таким образом получаем



Так же можжно кэшировать один раз запрошеную функцию), круто я придумал, kobezzza? так мы сможем хоть протектед сделать)

UIjs 10.05.2015 19:33

кроме того eval сохраняет замыкание, по этому если запретить в обьявлении класса использовать замыкания во вне (а у меня это и так запрещено потому что все зависимости надо подключать как в ангуляре через параметры к функции), то тогда мы смоежм проивалить код функции описывающей класс и засунуть в её замыкание ссылки на свойства super parent и все такое

w = (function(){
    var qq = 11;
    return eval("(function(){ alert(qq) })")
})();


w()


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


дальше встает проблема как передавать контекст this в те функции, которые мы запрашвиаем через parent и super


я просто думаю как сделать чтобы можно было писать не this.parent а просто parent, а дальше работала магия


можно например методы класса обернуть во врапперы, которые будут текущий this складывать в определенное место к которому parent будет иметь доступ. но опять же, врапперы. долго. нужно что то хитрее) помогай!

kobezzza 10.05.2015 20:09

Цитата:

круто я придумал, kobezzza?
Да, прикольно, я об этом не подумал.

Цитата:

кроме того eval сохраняет замыкание
С eval отладчики с ума сходят, тогда уж генерь Blob и подключай его как скрипт.

Цитата:

(а у меня это и так запрещено потому что все зависимости надо подключать как в ангуляре через параметры к функции)
Это очень плохой подход, люто бесит ангуляр за это. Проще использовать Java like подход - 1 класс = 1 файл, а зависимости подключать через нормальные модули ES6 или другого языка.

Цитата:

то тогда мы смоежм проивалить код функции описывающей класс и засунуть в её замыкание ссылки на свойства super parent и все такое
Да, но не будет нормальной поддержки IDE и программ стат анализа. Да и уж если на то пошло, то тогда лучше вообще отказаться от рантайм логики, а использовать подход макросов, аля http://sweetjs.org/

Т.е. почему бы тебе вместо того, чтобы плясать в рантайме и делать магию, а просто сделать надмножество над самим языком (как например Iced Coffee Script сделан над Coffee Script).

UIjs 10.05.2015 20:11

Цитата:

Сообщение от kobezzza
нормальные модули ES6

я уже подумал и понял что все это фигня, я же новый фреймворк решил писать Mega.js ну вот буду писать его на ES6 куда деваться. будут активно исползоваться сеттеры и геттеры. И все такое прочее.


добавлю таким же способом приватные в классы ES6


Цитата:

Сообщение от kobezzza
Т.е. почему бы тебе вместо того, чтобы плясать в рантайме и делать магию, а просто сделать надмножество над самим языком (как например Iced Coffee Script сделан над Coffee Script).

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

kobezzza 10.05.2015 20:19

Цитата:

Сообщение от UIjs (Сообщение 370158)
это самый очевидный подход и мне бы тогда не пришлось думать о производитедьности но тогда встает: нужны специальные тулзы для того чтобы писать на фреймворке. нужны плагины для поддержки нового синтаксиса.

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

Цитата:

я же новый фреймворк решил писать Mega.js
Хех, удачи :)

UIjs 10.05.2015 20:21

kobezzza, как уж там назывется крутой ES6 транслятор?
ну тип самый быстрый, самый минимальнокодагенерируемы й и.т.п.

kobezzza 10.05.2015 20:22

Цитата:

Сообщение от UIjs (Сообщение 370161)
kobezzza, как уж там назывется крутой ES6 транслятор?
ну тип самый быстрый, самый минимальнокодагенерируемы й и.т.п.

https://github.com/babel/babel

UIjs 10.05.2015 20:22

kobezzza, эт точно самый крутой?

kobezzza 10.05.2015 20:23

Цитата:

Сообщение от UIjs (Сообщение 370163)
kobezzza, эт точно самый крутой?

Да.


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