setters react profundización getters example es6 and ecmascript-6 babeljs

ecmascript 6 - react - ES6 getter/setter con función de flecha



javascript class getters and setters (3)

Estoy usando babel6 y para mi proyecto de mascota 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?


De acuerdo con la gramática ES2015, una propiedad en un objeto literal solo puede ser una de cuatro cosas:

Definición de propiedad :

  • IdentificadorReferencia
  • PropertyName : AssignmentExpression
  • Método Definición

El único de estos tipos que permite una get MethodDefinition es MethodDefinition :

Método Definición :

  • PropertyName ( StrictFormalParameters ) { FunctionBody }
  • Método generador
  • get PropertyName ( ) { FunctionBody }
  • set PropertyName ( PropertySetParameterList ) { FunctionBody }

Como puede ver, el formulario get sigue una gramática muy limitada que debe ser de la forma

get NAME () { BODY }

La gramática no permite que las funciones de la forma get NAME = ...


La respuesta aceptada es genial. Es mejor si está dispuesto a usar la sintaxis de función normal en lugar de la "sintaxis de función de flecha" compacta.

Pero tal vez realmente te gustan 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 necesitar una solución diferente.

Por ejemplo, noto que OP usa this , es posible que desee vincular this léxicamente; también conocido como "no vinculante de esto" ), y las funciones de flecha son buenas para ese enlace léxico.

Todavía puede usar una función de flecha con un getter mediante la técnica Object.defineProperty .

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

Consulte las menciones de la técnica de object initialization de object initialization (también conocida como get NAME() {...} ) frente a la técnica defineProperty (también conocida como get : ()=>{} ) . Hay al menos una diferencia significativa, el uso de defineProperty requiere que las variables ya existan:

Definir un captador en objetos existentes

es decir, con Object.defineProperty debe asegurarse de que your_obj (en mi ejemplo) existe y se guarda en una variable (mientras que con una object-initialization puede devolver un literal de objeto en su inicialización de objeto: {..., get(){ }, ... } ). Más información sobre Object.defineProperty específicamente, aquí

Object.defineProperty(...) parece tener compatibilidad de navegador comparable a la sintaxis get NAME(){...} ; navegadores modernos, IE 9.


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

acceso al objeto padre en clase

me funcionó: P