Доступ к свойству класса из функции, вложенной в объект - PullRequest
0 голосов
/ 08 мая 2018

Редактировать: я заменил свой первоначальный пример на что-то ближе к моему фактическому коду, который все еще демонстрирует ту же проблему (как на JSFiddle, так и на площадке TypeScript).

Скажем, у меня есть класс Typescript, определенный ниже, где одно свойство доступно геттеру, вложенному в другое свойство объекта. Очевидно, что this внутри геттера weekdays.monday ссылается на weekdays, а не actual.

class DayOfWeekSelector {
  private actual = {
    monday: false,
    /*tuesday - sunday would go here*/
  }

  public weekdays = {
    get monday() {
      return this.actual.monday;
    },
    set monday(newVal) {
      this.actual.monday = newVal;
    },
    /*tuesday - sunday would go here*/
  }
}

const dow = new DayOfWeekSelector();

//I want this to read the value of the 'monday' property of the private 'actual' object
//but instead, it tries to read 'actual' as a property of 'weekdays', and fails
console.log(dow.weekdays.monday);

JSFiddle link: https://jsfiddle.net/dimmreaper/4v6k6ssx/

Я знаю, что в этой простой демонстрации я мог бы просто извлечь геттер из объекта в свойство непосредственно в классе, и тогда this будет ссылаться на класс. Но есть ли другой способ доступа к свойствам DayOfWeekSelector из методов получения и установки в другом объекте класса, без добавления беспорядка?

1 Ответ

0 голосов
/ 09 мая 2018

Не используйте синтаксис свойства класса, а пишите их явно в конструкторе, где вы можете использовать локальные переменные:

class DayOfWeekSelector {
  public weekdays;
  constructor() {
    const actual = {
      monday: false,
      /*tuesday - sunday would go here*/
    };
    this.weekdays = {
      get monday() {
        return actual.monday;
      },
      set monday(newVal) {
        actual.monday = newVal;
      },
      /*tuesday - sunday would go here*/
    };
  }
}
const dow = new DayOfWeekSelector();
console.log(dow.weekdays.monday);

Конечно, если это ваши настоящие методы получения и установки, которые ничего не делают, кроме доступа к "частному" объекту, то их использование вообще не дает никаких преимуществ, гораздо проще напрямую выставить объект actual.

...