MST

星途 面试题库

面试题:TypeScript装饰器在类属性上的应用

请用TypeScript编写一个类,包含一个属性,并使用装饰器对该属性进行操作,实现属性值在获取和设置时打印日志。描述你所编写装饰器的工作原理。
22.2万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 定义装饰器
function logProperty(target: any, propertyKey: string) {
    let value: any;

    const getter = function() {
        console.log(`获取属性 ${propertyKey} 的值:`, value);
        return value;
    };

    const setter = function(newValue: any) {
        console.log(`设置属性 ${propertyKey} 的值为:`, newValue);
        value = newValue;
    };

    if (delete target[propertyKey]) {
        Object.defineProperty(target, propertyKey, {
            get: getter,
            set: setter,
            enumerable: true,
            configurable: true
        });
    }
}

// 使用装饰器的类
class MyClass {
    @logProperty
    myProperty: string;

    constructor() {
        this.myProperty = '初始值';
    }
}

// 测试
const myInstance = new MyClass();
console.log(myInstance.myProperty); 
myInstance.myProperty = '新值'; 

装饰器工作原理

  1. 定义装饰器函数 logProperty:该函数接收两个参数,target 表示被装饰的对象(对于属性装饰器,target 是包含该属性的类的原型对象),propertyKey 是被装饰属性的名称。
  2. 定义 gettersetter 函数
    • getter 函数在获取属性值时被调用,它打印获取属性值的日志,并返回实际的属性值。
    • setter 函数在设置属性值时被调用,它打印设置属性值的日志,并更新实际的属性值。
  3. 使用 Object.defineProperty:通过 Object.defineProperty 方法,将带有 gettersetter 函数的属性重新定义到 target 上。delete target[propertyKey] 确保先删除原有的属性定义,以便正确设置新的访问器属性。
  4. 在类中使用装饰器:在 MyClass 类的 myProperty 属性上应用 @logProperty 装饰器,这样当获取或设置 myProperty 的值时,就会触发相应的日志打印。