Как сделать свойства перебираемыми при описании геттеров/сеттеров 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"]
|
nerv_, полагаю, никак. А в каких задачах ты юзаешь акцессоры, если не секрет?
|
Цитата:
Допустим: store.prop // читает из localStorage store.prop = 1 // пишет в localStorage |
nerv_, я просто не могу упустить возможности порекомендовать тебе заюзать Матрешку. Сейчас функции, которые работают с объектами вынесены в небольшую либу, которая находится в папке /magic репки.
class Foo {
constructor() {
magic.on(this, 'change:prop', evt => localStorage.prop = this.prop);
}
}
И не нужно городить огороды с символами. |
nerv_, так ты тут хочешь сделать enumerable свойство, которое объявлено в прототипе объекта. Если ты хочешь, чтобы оно было доступно именно в объекте, то придётся объявлять его на самом объекте, ничего не попишешь :С
Если у тебя таких свойств много -- сделай ф-цию, которая будет пробегать по obj.__proto__, находить все элементы, для которых Object.getOwnPropertyDescriptor возвращает объект, в котором есть геттер, и ставить их самому объекту. Это, конечно, тоже извращение, но хотя бы инкапсулированное извращение. |
|
'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, лаконичнее, плюсую) Не додумался использовать объект, полученный от Object.getOwnPropertyDescriptor, использовать в Object.defineProperty)
|
Цитата:
1. приватности 2. скорости набора кода 3. лучшего сжатия кода Цитата:
devote, спасибо. Цитата:
Я для наглядности для себя сделал так
'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;
}
}
|
Цитата:
1. В матрешке вся информация о "специальных" свойствах хранится в свойстве-объекте Symbol(matreshka). 2. Эм, тут вообще не понял. Твой синтаксис с символами выглядит жирно. 3. А сжатие тут причем? Или ты имеешь в виду, что не хочешь тащить зависимость? Тогда ОК. |
| Часовой пояс GMT +3, время: 04:03. |