J'essaye d'implémenter un décorateur qui remplace une propriété (1) et définit une propriété cachée (2). Supposons que l'exemple suivant:Décorateur tapuscrit et comportement bizarre Object.defineProperty
function f() {
return (target: any, key: string) => {
let pKey = '_' + key;
// 1. Define hidden property
Object.defineProperty(target, pKey, {
value: 0,
enumerable: false,
configurable: true,
writable: true
});
// 2. Override property get/set
return Object.defineProperty(target, key, {
enumerable: true,
configurable: true,
get:() => target[pKey],
set: (val) => {
target[pKey] = target[pKey] + 1;
}
});
};
}
class A {
@f()
propA = null;
propB = null;
}
let a = new A();
console.log(Object.keys(a), a.propA, a._propA, a);
qui délivre en sortie:
[ 'propB' ] 1 1 A { propB: null }
Cependant, je préférerais attendre:
[ 'propA', 'propB' ] 1 1 A { propA: 1, propB: null }
depuis enumerable
est true
pour propA
.
Maintenant, si je remplace get
et set
avec
get: function() {
return this[pKey]
},
set: function (val) {
this[pKey] = this[pKey] + 1;
}
la sortie est maintenant:
[ '_propA', 'propB' ] 1 1 A { _propA: 1, propB: null }
Bien que enumerable
est explicitement défini à false
pour _propA
en f
. Donc, aussi bizarre que ces comportements puissent être, j'aimerais comprendre ce qui se passe ici, et comment j'implémenterais ce que j'essaie d'obtenir?