Как сделать свойства перебираемыми при описании геттеров/сеттеров 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, время: 20:51. |