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'']
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}`; }
} );
}
}
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.