29.09.2015, 16:55
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Как сделать свойства перебираемыми при описании геттеров/сеттеров es6?
'use strict';
const __PROP = Symbol();
class Foo {
constructor() {
this.prop = 1;
}
get prop() {
return this[__PROP];
}
set prop(value) {
this[__PROP] = value;
}
}
let bar = new Foo();
console.log(bar.prop); // 1
console.log(Object.keys(bar)); // []
Это возможно БЕЗ пронографии вида?
'use strict';
const __PROP = Symbol();
class Foo {
constructor() {
Object.defineProperty(this, 'prop', {
enumerable: true,
get() {
return this[__PROP];
},
set(value) {
this[__PROP] = value;
}
});
this.prop = 1;
}
}
let bar = new Foo()
console.log(bar.prop); // 1
console.log(Object.keys(bar)); // ["prop"]
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
29.09.2015, 17:01
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
nerv_, полагаю, никак. А в каких задачах ты юзаешь акцессоры, если не секрет?
|
|
29.09.2015, 17:20
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от FINoM
|
А в каких задачах ты юзаешь акцессоры
|
много где Например, при работе с localStorage.
Допустим:
store.prop // читает из localStorage
store.prop = 1 // пишет в localStorage
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
29.09.2015, 17:47
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
nerv_, я просто не могу упустить возможности порекомендовать тебе заюзать Матрешку. Сейчас функции, которые работают с объектами вынесены в небольшую либу, которая находится в папке /magic репки.
class Foo {
constructor() {
magic.on(this, 'change:prop', evt => localStorage.prop = this.prop);
}
}
И не нужно городить огороды с символами.
|
|
29.09.2015, 19:14
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
nerv_, так ты тут хочешь сделать enumerable свойство, которое объявлено в прототипе объекта. Если ты хочешь, чтобы оно было доступно именно в объекте, то придётся объявлять его на самом объекте, ничего не попишешь :С
Если у тебя таких свойств много -- сделай ф-цию, которая будет пробегать по obj.__proto__, находить все элементы, для которых Object.getOwnPropertyDescriptor возвращает объект, в котором есть геттер, и ставить их самому объекту. Это, конечно, тоже извращение, но хотя бы инкапсулированное извращение.
|
|
29.09.2015, 19:30
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Во, меня проперло)
Посмотреть.
|
|
30.09.2015, 00:12
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
'use strict';
const __PROP = Symbol();
class Foo {
constructor() {
Object.getOwnPropertyNames(this.__proto__).forEach((key) => {
var descriptor = Object.getOwnPropertyDescriptor(this.__proto__, key);
if (descriptor && (typeof descriptor.get === "function" || typeof descriptor.set === "function")) {
descriptor.enumerable = true;
Object.defineProperty(this, key, descriptor);
}
});
this.prop = 1;
}
get prop() {
return this[__PROP];
}
set prop(value) {
this[__PROP] = value;
}
}
let bar = new Foo();
console.log(bar.prop); // 1
console.log(Object.keys(bar)); // ["prop"]
Последний раз редактировалось devote, 01.10.2015 в 14:03.
|
|
30.09.2015, 00:15
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
devote, лаконичнее, плюсую) Не додумался использовать объект, полученный от Object.getOwnPropertyDescriptor, использовать в Object.defineProperty)
|
|
01.10.2015, 13:27
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от FINoM
|
я просто не могу упустить возможности порекомендовать тебе заюзать Матрешку
|
Зачем она здесь? В моем примере символ для:
1. приватности
2. скорости набора кода
3. лучшего сжатия кода
Сообщение от trikadin
|
так ты тут хочешь сделать enumerable свойство, которое объявлено в прототипе объекта.
|
нет другого способа в es6 объявлять геттеры и сеттеры в классах
devote, спасибо.
Сообщение от devote
|
var self = this;
|
не надо (на первый взгляд), т.к. arrow function
Я для наглядности для себя сделал так
'use strict';
const __PROP = Symbol();
class Foo {
constructor() {
this.__setEnumerable('prop', true);
this.prop = 1;
}
get prop() {
return this[__PROP];
}
set prop(value) {
this[__PROP] = value;
}
__setEnumerable(prop, state) {
let prototype = this.constructor.prototype;
let descriptor = Object.getOwnPropertyDescriptor(prototype, prop);
descriptor.enumerable = state;
Object.defineProperty(this, prop, descriptor);
}
}
let bar = new Foo();
console.log(bar.prop); // 1
console.log(Object.keys(bar)); // ["prop"]
Жалко, что так нельзя:
class Foo {
constructor() {
this.prop.__enumerable = true;
this.prop = 1;
}
}
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 01.10.2015 в 13:30.
|
|
01.10.2015, 13:32
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от nerv_
|
1. приватности
2. скорости набора кода
3. лучшего сжатия кода
|
Я ничего не навязываю, просто не совсем тебя понимаю.
1. В матрешке вся информация о "специальных" свойствах хранится в свойстве-объекте Symbol(matreshka).
2. Эм, тут вообще не понял. Твой синтаксис с символами выглядит жирно.
3. А сжатие тут причем? Или ты имеешь в виду, что не хочешь тащить зависимость? Тогда ОК.
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Как сделать HTML фичи? |
2chan |
Events/DOM/Window |
6 |
26.09.2014 18:50 |
|
|
|