Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #291 (permalink)  
Старый 29.09.2015, 16:55
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 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"]
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #292 (permalink)  
Старый 29.09.2015, 17:01
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

nerv_, полагаю, никак. А в каких задачах ты юзаешь акцессоры, если не секрет?
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #293 (permalink)  
Старый 29.09.2015, 17:20
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от FINoM
А в каких задачах ты юзаешь акцессоры
много где Например, при работе с localStorage.

Допустим:
store.prop // читает из localStorage
store.prop = 1 // пишет в localStorage
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #294 (permalink)  
Старый 29.09.2015, 17:47
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

nerv_, я просто не могу упустить возможности порекомендовать тебе заюзать Матрешку. Сейчас функции, которые работают с объектами вынесены в небольшую либу, которая находится в папке /magic репки.
class Foo {
  constructor() {
    magic.on(this, 'change:prop', evt => localStorage.prop = this.prop);
  }
}


И не нужно городить огороды с символами.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #295 (permalink)  
Старый 29.09.2015, 19:14
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

nerv_, так ты тут хочешь сделать enumerable свойство, которое объявлено в прототипе объекта. Если ты хочешь, чтобы оно было доступно именно в объекте, то придётся объявлять его на самом объекте, ничего не попишешь :С

Если у тебя таких свойств много -- сделай ф-цию, которая будет пробегать по obj.__proto__, находить все элементы, для которых Object.getOwnPropertyDescriptor возвращает объект, в котором есть геттер, и ставить их самому объекту. Это, конечно, тоже извращение, но хотя бы инкапсулированное извращение.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #296 (permalink)  
Старый 29.09.2015, 19:30
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Во, меня проперло)

Посмотреть.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #297 (permalink)  
Старый 30.09.2015, 00:12
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 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"]
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 01.10.2015 в 14:03.
Ответить с цитированием
  #298 (permalink)  
Старый 30.09.2015, 00:15
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

devote, лаконичнее, плюсую) Не додумался использовать объект, полученный от Object.getOwnPropertyDescriptor, использовать в Object.defineProperty)
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #299 (permalink)  
Старый 01.10.2015, 13:27
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 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.
Ответить с цитированием
  #300 (permalink)  
Старый 01.10.2015, 13:32
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от nerv_
1. приватности
2. скорости набора кода
3. лучшего сжатия кода
Я ничего не навязываю, просто не совсем тебя понимаю.

1. В матрешке вся информация о "специальных" свойствах хранится в свойстве-объекте Symbol(matreshka).
2. Эм, тут вообще не понял. Твой синтаксис с символами выглядит жирно.
3. А сжатие тут причем? Или ты имеешь в виду, что не хочешь тащить зависимость? Тогда ОК.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать HTML фичи? 2chan Events/DOM/Window 6 26.09.2014 18:50