私はプロパティ(1)をオーバーライドし、隠しプロパティ(2)を定義するデコレータを実装しようとしています。次の例を想定しますTypescriptデコレータと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);
出力する:
[ 'propB' ] 1 1 A { propB: null }
しかし、私はむしろ期待:enumerable
以来
[ 'propA', 'propB' ] 1 1 A { propA: 1, propB: null }
がpropA
ためtrue
です。私は
get: function() {
return this[pKey]
},
set: function (val) {
this[pKey] = this[pKey] + 1;
}
でget
とset
を交換する場合
は今、出力は以下のようになります。
[ '_propA', 'propB' ] 1 1 A { _propA: 1, propB: null }
enumerable
が明示的にf
に_propA
ためfalse
に設定されているが。
このような振る舞いが奇妙なので、私はここで何が起こっているのか理解したいと思います。