Avec l’avènement de l’ES6, la POO est bien plus évidente qu’auparavant. Et j’en arrive à vouloir utiliser des pattern usuels transposés d’autres langage, comme dans cet exemple où je souhaite ajouter méthodes et propriétés à une classe de façon « dynamique », c’est à dire à postériori et dont les noms vont être définis de façon dynamique.

La classe ititiale

class MyClass() {
constructor() {
// ...
}
static methodA(argument) {
// ...
}
}

Ajout d’une méthode statique

// Nom de ma méthode statique
let methodName = 'methodB';
// Ajout de la méthode à ma class
Object.defineProperty(MyClass, methodName, {
enumerable: false,
writable: false,
configurable: false,
value: (value) => {
return MyClass.methodA(argument);
}
});

Ajout d’une propriété dynamique

let propertyName = ‘myproperty’;

Object.defineProperty(MyClass, propertyName, {
enumerable: false,
writable: false,
configurable: false,
value: 'here the value'
});

On pourra alors avoir accès directement à la propriété myproperty avec MyClass.myproperty

Ajout d’un getter/setter pour une propriété dynamique


let propertyName = 'myproperty';
Object.defineProperty(MyClass.prototype, propertyName, {
get: function() {
return this.methodToFetchFromPropertyName(propertyName);
},
set: function(value) {
this.methodToSetFromPropertyName(propertyName, value);
}
});

La propriété « de l’instace sera accessible et appellera de façon masqué les méthodes de getter methodToFetchFromPropertyName et setter methodToSetFromPropertyName définies ci-dessus

let instance = new MyClass();
MyClass.myproperty = 'some content';
console.log(MyClass.myproperty);