Я использую babel6 и для своего любимого проекта создаю оболочку для XMLHttpRequest для методов, которые я могу использовать:
open = (method, url, something) => {
return this.xhr.open(method, url, something);
}
но для свойств стрелочная функция не работает
это работает:
get status() { return this.xhr.status; }
но я не могу использовать
get status = () => this.xhr.status;
Это намеренно?
ecmascript-6
babeljs
Габор Долла
источник
источник
(method, url, something) => this.xhr.open(method. url, something)
.get
является частью литерала объекта или определения класса, а присвоение переменной - нет. Как вы думаете, почему они должны работать одинаково?status => this.xhr.status
(get status() => this.xhr.status
синтаксис c # 7) или, может быть , действительно был бы отличным синтаксическим сахаром для удобочитаемости, но Javascript not Typescript (пока?) не поддерживает егоОтветы:
Согласно грамматике ES2015, свойство литерала объекта может быть только одним из четырех:
Единственный из этих типов, который допускает ведущие,
get
- это MethodDefinition :Как видите,
get
форма следует очень ограниченной грамматике, которая должна иметь видГрамматика не допускает функций формы
get NAME = ...
.источник
Принятый ответ великолепен. Лучше всего, если вы хотите использовать обычный синтаксис функции вместо компактного «синтаксиса стрелочной функции».
Но, может быть, вам действительно нравятся стрелочные функции; возможно, вы используете стрелочную функцию по другой причине, которую не может заменить обычный синтаксис функции ; вам может понадобиться другое решение.
Например, я заметил использование OP
this
, вы можете захотеть выполнить лексическое связываниеthis
; aka «не привязка этого» ), и стрелочные функции хороши для этой лексической привязки.Вы все еще можете использовать стрелочную функцию с геттером через эту
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.источник
get status() { return this.xhr.status; }
this
должен быть объектом, в котором вашget status() { ... }
определяется. Но mythis
может быть чем-то другим из-за различий в лексической привязке, верно?this
не то, что мне нужно, в аксессуаре get. (Преимуществаthis
привязки стрелочных функций, кажется,()=>{}
для обратных вызовов, которые я передаю в Promise , например$http(...).then((promise_result)=> this...}))
. Если я не использую жирную стрелку,this
будет представлять глобальныйWindow
объект; не очень полезно. Но я редко (никогда?) Использовал()=>{}
в качестве функции для "получить аксессор", как вы говорите ... по крайней мере,this
внутриget()
будет представлять объект, для которогоget()
определен (что уже более полезно, чемWindow
; поэтому нет необходимости использовать функция жирной стрелки!)defineProperty
Подход полезен в петлях. Прямо сейчас я просто использовал его, чтобы показать некоторые свойства объекта chiled из содержащего.