속성 (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
를 교체하는 경우
이제, 출력은 지금 : enumerable
비록
[ '_propA', 'propB' ] 1 1 A { _propA: 1, propB: null }
이 명시 적으로 f
에서 _propA
에 대한 false
로 설정됩니다.
이러한 동작이 이상 할 수 있으므로 여기에서 무슨 일이 일어나고 있는지, 내가 얻으려고하는 것을 어떻게 구현하는지 알고 싶습니다.