[1] getter/setter 하이재킹
- Note: Object.defineProperty()를 이용한 인스턴스 멤버 변수에 대한 재정의는 제대로 동작하지 않음. (2024. 03. 13)
// 데코레이터 함수 정의
function logProperty(target: any, key: string) {
// 현재 클래스의 프로퍼티에 접근하는 데코레이터 로직
let value = target[key];
const getter = function () {
console.log(`Getting value: ${value}`);
return value;
};
const setter = function (newValue: any) {
console.log(`Setting value: ${newValue}`);
value = newValue;
};
// 실제로 프로퍼티를 수정
Object.defineProperty(target, key, {
get: getter,
set: setter,
enumerable: true,
configurable: true,
});
}
// 클래스 정의
class ExampleClass {
// 멤버 변수에 데코레이터 적용
@logProperty
public myProperty: string;
constructor(value: string) {
this.myProperty = value;
}
}
// 인스턴스 생성
const instance = new ExampleClass('Initial Value');
// 데코레이터에 의해 프로퍼티 값에 접근 및 수정 시 로그 출력
console.log(instance.myProperty); // Getting value: Initial Value
instance.myProperty = 'New Value'; // Setting value: New Value
console.log(instance.myProperty); // Getting value: New Value