Усилитель/сеттер 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;
Является ли это намеренным?
Ответы
Ответ 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