variable setters getters es6 attribute and javascript ecmascript-6 babeljs es2015

setters - javascript class attribute



ConfiguraciĆ³n de un getter de clase ES6 enumerable (2)

Tengo una clase de ES6 (transcompilada con babeljs) con una propiedad getter. Entiendo que estas propiedades no son enumerables por defecto. Sin embargo, no entiendo por qué no puedo hacer que la propiedad sea enumerable usando Object.defineProperty

// Declare class class Person { constructor(myName) { this.name = myName; } get greeting() { return `Hello, I''m ${this.name}`; } } // Make enumerable (doesn''t work) Object.defineProperty(Person, ''greeting'', {enumerable: true}); // Create an instance and get enumerable properties var person = new Person(''Billy''); var enumerableProperties = Object.keys(person); // => [''name'']

Ejemplo de Plunker


Los captadores de estilo ES6 se definen en el prototipo, no en cada person individual. Para establecer la propiedad de greeting enumerable necesita cambiar:

// Make enumerable (doesn''t work) Object.defineProperty(Person, ''greeting'', {enumerable: true});

A:

// Make enumerable Object.defineProperty(Person.prototype, ''greeting'', {enumerable: true});

Object.keys solo devuelve los objetos que poseen propiedades enumerables, por lo que las propiedades en el prototipo no se devuelven. Encontrará la propiedad de greeting en Object.keys( Object.getPrototypeOf( person ) ) , o en un bucle for...in . Plunker actualizado

Si, por el contrario, desea que cada instancia individual de Person tenga su propio greeting , puede definirlo en el constructor:

class Person { constructor(myName) { this.name = myName; Object.defineProperty( this, ''greeting'', { enumerable: true, get: function ( ) { return `Hello, I''m ${this.name}`; } } ); } }

Plunker actualizado


Puedes hacer un truco como este:

class Person { static createFields({ name }) { return { name, get greeting() { return `Hello, I''m ${this.name}`; } } } constructor(...args) { const inst = this.constructor.createFields(...args) const desc = Object.getOwnPropertyDescriptors(inst) Object.defineProperties(this, desc) return this } }

El beneficio es que los captadores en un objeto simple son enumerables y configurables por defecto, no tiene que preocuparse por estos modificadores cada vez.

Pero ... parece un poco extraño) No estoy seguro de si esto debería ser usado realmente.