29.04.2015, 21:16
|
Интересующийся
|
|
Регистрация: 27.04.2015
Сообщений: 18
|
|
Сообщение от kobezzza
|
Прокси экономят память и не занимают времени при инициализации объекта
|
Внезапно, обычные прототипы делают то же самое
|
|
29.04.2015, 21:19
|
Интересующийся
|
|
Регистрация: 27.04.2015
Сообщений: 18
|
|
kobezzza,
Вообще, в целом, ты пытаешься засунуть Proxy туда, для чего они не предназначены. Я против Proxy ничего не имею, просто назначение у них несколько иное. Это, в первую очередь -- инструмент метапрограммирования.
|
|
29.04.2015, 21:21
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Сообщение от nondeterminism
|
Внезапно, обычные прототипы делают то же самое
|
И как ты на прототипах сделаешь чтобы this в this.protected.foo() ссылался на наш объекта, а не на this.protected без биндингов или явных указаний?
Хотя в кошерном ES7 можно будет просто написать:
this::protected.foo() // protected.foo.call(this)
Таска на добавление в Babel уже висит
Последний раз редактировалось kobezzza, 29.04.2015 в 21:30.
|
|
29.04.2015, 21:35
|
Интересующийся
|
|
Регистрация: 27.04.2015
Сообщений: 18
|
|
Сообщение от kobezzza
|
чтобы this в this.protected.foo()
|
Я не совсем понял задачу. this вообще не может никуда ссылаться, он динамически связывается. Что ты тут под protected подразумеваешь, тоже не вполне понятно. В JS, насколько мне известно, его можно реализовать только лексическими замыканиями.
Короче, опиши задачу четче.
|
|
29.04.2015, 21:50
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Вот валидный и рабочий пример на 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 подразумеваешь, тоже не вполне понятно.
|
Методы и свойства доступные внутри класса и его потомков, но закрытые наружу.
Последний раз редактировалось kobezzza, 29.04.2015 в 21:53.
|
|
29.04.2015, 21:51
|
Интересующийся
|
|
Регистрация: 27.04.2015
Сообщений: 18
|
|
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
|
|
29.04.2015, 21:55
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
И как в твоём примере доопределять методы в дочерних классах, как решается конфликт имён, как вводить новые свойства и методы не из замыкания, как сделать нормальный синтаксис, а не то сраное говно, которое ты написал?
PS: только сейчас я понял, что спорю с Foo, поэтому прекращаю это занятие.
|
|
30.04.2015, 10:25
|
Профессор
|
|
Регистрация: 24.04.2015
Сообщений: 183
|
|
Сообщение от kobezzza
|
поиграйся с Proxy
|
прокси опять же, производительность, нужно максимаально нативно все сделать
Сообщение от nondeterminism
|
засунуть Proxy туда, для чего они не предназначены
|
прокси и предназначены для описания поведения обьектов на таких низких уровнях, то есть как раз для подобных вещей
Сообщение от nondeterminism
|
this вообще не может никуда ссылаться, он динамически связывается. Что ты тут под protected подразумеваешь, тоже не вполне понятно. В JS, насколько мне известно, его можно реализовать только лексическими замыканиями.
|
слишком толсто несешь ахинею, попробуй потоньше, попробуй добавтить больше связи между словами, тогда мож кто и клюнет, а так просто набор терминов
kobezzza, не ну по сути закрытость внаружу дает неймспейс.
Так что просто между this.protected.method и this.protectedMethod разница не особая) , все лучший вариант уже обозначен. неймспейс _ . я вспомнил, когда я пилил Class я решил что это и есть протектет и сахар для этого не обязательно.
Сообщение от kobezzza
|
спорю с Foo
|
эт типа мне сменка пришла)?
Последний раз редактировалось UIjs, 30.04.2015 в 10:36.
|
|
30.04.2015, 11:24
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Цитата:
|
прокси опять же, производительность, нужно максимаально нативно все сделать
|
Ну ты же можешь при первом вызове кешировать вызов и дальше он уже не через прокси будет крутится, хотя это больше рассуждения вслух, вариант с _ самый лучший пока не сделают нативную поддержку)
Цитата:
|
эт типа мне сменка пришла)?
|
Угу
|
|
30.04.2015, 11:32
|
Профессор
|
|
Регистрация: 24.04.2015
Сообщений: 183
|
|
Сообщение от kobezzza
|
Ну ты же можешь при первом вызове кешировать вызов
|
я могу это и геттерами сделать), просто обьект this.protected наследую от Class.prototype и в this.protected вешаю геттеры, которые при обращении создадут забиндиную протектед функцию из Class.prototype и заменят геттер на значение этой функции. хм, можно угарнуть, а обьявлять их как и где? надо чтобы и на кофи работало и на яваскрипте и норм смотрелось)
Последний раз редактировалось UIjs, 30.04.2015 в 11:34.
|
|
|
|