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).getes 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.statushubiera 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
getes MethodDefinition :Como puede ver, la
getforma 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 enlazarthislé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.definePropertytécnica.Ver menciones de
object initializationtécnica (aliasget NAME() {...}) vsdefinePropertytécnica (aliasget : ()=>{}) . Hay al menos una diferencia significativa, el usodefinePropertyrequiere que las variables ya existan:es decir, con
Object.definePropertydebe asegurarse de queyour_obj(en mi ejemplo) exista y se guarde en una variable (mientras que con aobject-initializationpodría devolver un objeto-literal en la inicialización de su objeto :){..., get(){ }, ... }. Más información sobreObject.definePropertyespecí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; }thisdebe ser el objeto en el queget status() { ... }se define tu. Pero mithispodría ser otra cosa, debido a diferencias léxicas vinculantes, ¿verdad?thisque no sea lo que quiero en un acceso de obtención. (Losthisbeneficios 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,thisrepresentará elWindowobjeto global ; no muy útil. Pero rara vez (¿nunca?) He usado()=>{}como función para un "obtener acceso" como usted dice ... al menosthisdentro 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!)