Подтвердить что ты не робот

Усилитель/сеттер ES6 со стрелкой

Я использую babel6, и для моего проекта моего любителя я создаю оболочку для XMLHttpRequest, для методов, которые я могу использовать:

open = (method, url, something) => {
  return this.xhr.open(method, url, something);
}

но для свойств функция со стрелками не работает

это работает:

get status() { return this.xhr.status; }

но я не могу использовать

get status = () => this.xhr.status;

Является ли это намеренным?

4b9b3361

Ответ 1

Согласно грамматике ES2015 свойство в литературе объекта может быть только одной из четырех вещей:

PropertyDefinition:

  • IdentifierReference
  • PropertyName : Выделение присваивания
  • MethodDefinition

Единственный из этих типов, который позволяет ведущему get MethodDefinition:

MethodDefinition:

  • PropertyName ( StrictFormalParameters ) { FunctionBody }
  • GeneratorMethod
  • get PropertyName ( ) { FunctionBody }
  • set PropertyName (PropertySetParameterList ) { FunctionBody }

Как вы можете видеть, форма get следует очень ограниченной грамматике, которая должна иметь вид

get NAME () { BODY }

Грамматика не допускает функций вида get NAME = ....

Ответ 2

Принятый ответ великолепен. Лучше всего, если вы хотите использовать обычный синтаксис функции вместо компактного "синтаксиса функции стрелки".

Но, возможно, вам действительно нравятся функции стрелок; возможно, вы используете функцию стрелки по другой причине, которую нормальный синтаксис функции не может заменить; вам может понадобиться другое решение.

Например, я заметил, что OP использует this, вы можете связать this лексически; ака "необязательность этого"), и функции стрелок хороши для этого лексического связывания.

Вы все еще можете использовать функцию стрелки с геттером с помощью техники Object.defineProperty.

{
  ...
  Object.defineProperty(your_obj, 'status', { 
     get : () => this.xhr.status 
  });
  ...
}

См. упоминания о методике object initialization (он же get NAME() {...}) по сравнению с техникой defineProperty (он же get : ()=>{}). Существует по крайней мере одно существенное отличие, использование defineProperty требует, чтобы переменные уже существовали:

Определение геттера для существующих объектов

то есть с Object.defineProperty вы должны убедиться, что your_obj (в моем примере) существует и сохранен в переменную (тогда как с помощью object-initialization вы могли бы вернуть литерал объекта в инициализации вашего объекта: {..., get(){ }, ... }). Подробнее о Object.defineProperty, в частности, здесь

Object.defineProperty(...), похоже, поддерживает браузер сравнимый с синтаксисом get NAME(){...}; современные браузеры, IE 9.

Ответ 3

        _getvalue: () => {
            return this.array.length;
        }
        get value(): number {
            return this._getvalue();;
        }

доступ к родительскому объекту в классе

это работает для меня: P