プロパティ (1) をオーバーライドし、隠しプロパティ (2) を定義するデコレータを実装しようとしています。次の例を想定します。
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 }
ただし、次のことを期待したいと思います。
[ 'propA', 'propB' ] 1 1 A { propA: 1, propB: null }
ですのでenumerable
ご了承ください。true
propA
さて、 とを置き換えるget
とset
get: function () {
return this[pKey]
},
set: function (val) {
this[pKey] = this[pKey] + 1;
}
出力は次のとおりです。
[ '_propA', 'propB' ] 1 1 A { _propA: 1, propB: null }
ただし、 for in にenumerable
明示的に設定されています。false
_propA
f
したがって、これらの動作が奇妙である可能性があるので、ここで何が起こっているのか、取得しようとしているものをどのように実装するのかを理解したいと思いますか?