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

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 и заменят геттер на значение этой функции. хм, можно угарнуть, а обьявлять их как и где? надо чтобы и на кофи работало и на яваскрипте и норм смотрелось)


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