Estoy usando babel6 y para mi proyecto favorito estoy creando un contenedor para XMLHttpRequest, para los métodos que puedo usar:
open = (method, url, something) => {
return this.xhr.open(method, url, something);
}
pero para las propiedades la función de flecha no funciona
esto funciona:
get status() { return this.xhr.status; }
pero no puedo usar
get status = () => this.xhr.status;
¿Es esto intencional?
ecmascript-6
babeljs
Gabor Dolla
fuente
fuente
(method, url, something) => this.xhr.open(method. url, something)
.get
es parte de un objeto literal o una definición de clase, una asignación de variable no lo es. ¿Por qué crees que deberían funcionar igual?status => this.xhr.status
(sintaxis c # 7) o tal vezget status() => this.xhr.status
hubiera sido un gran azúcar sintáctico para la legibilidad, pero Javascript no Typecript no lo admite (¿todavía?)Respuestas:
Según la gramática de ES2015, una propiedad en un objeto literal solo puede ser una de cuatro cosas:
El único de estos tipos que permite un liderazgo
get
es MethodDefinition :Como puede ver, la
get
forma sigue una gramática muy limitada que debe ser de la formaLa gramática no permite funciones de la forma
get NAME = ...
.fuente
La respuesta aceptada es genial. Es mejor si está dispuesto a utilizar la sintaxis de función normal en lugar de la "sintaxis de función de flecha" compacta.
Pero tal vez te gusten mucho las funciones de flecha; tal vez use la función de flecha por otra razón que una sintaxis de función normal no puede reemplazar ; puede que necesite una solución diferente.
Por ejemplo, noto que OP usa
this
, es posible que desee enlazarthis
léxicamente; también conocido como "no vinculante de esto" ), y las funciones de flecha son buenas para ese vínculo léxico.Todavía puede usar una función de flecha con un captador a través de la
Object.defineProperty
técnica.Ver menciones de
object initialization
técnica (aliasget NAME() {...}
) vsdefineProperty
técnica (aliasget : ()=>{}
) . Hay al menos una diferencia significativa, el usodefineProperty
requiere que las variables ya existan:es decir, con
Object.defineProperty
debe asegurarse de queyour_obj
(en mi ejemplo) exista y se guarde en una variable (mientras que con aobject-initialization
podría devolver un objeto-literal en la inicialización de su objeto :){..., get(){ }, ... }
. Más información sobreObject.defineProperty
específicamente, aquíObject.defineProperty(...)
parece tener un soporte de navegador comparable a laget NAME(){...}
sintaxis; navegadores modernos, IE 9.fuente
get status() { return this.xhr.status; }
this
debe ser el objeto en el queget status() { ... }
se define tu. Pero mithis
podría ser otra cosa, debido a diferencias léxicas vinculantes, ¿verdad?this
que no sea lo que quiero en un acceso de obtención. (Losthis
beneficios vinculantes de las funciones de flecha parecen entrar en juego cuando se pasan las funciones, como con los controladores de eventos y las devoluciones de llamada.)()=>{}
para las devoluciones de llamada que paso a una Promesa , como$http(...).then((promise_result)=> this...}))
. Si no utilizo fat-arrow,this
representará elWindow
objeto global ; no muy útil. Pero rara vez (¿nunca?) He usado()=>{}
como función para un "obtener acceso" como usted dice ... al menosthis
dentro deget()
representará el objeto en el queget()
está definido (que ya es más útil queWindow
; por lo que no hay necesidad de usar una función de flecha gorda!)