MST
星途 面试题库

面试题:TypeScript类装饰器在复杂继承体系下的行为分析

假设有一个继承体系,基类 `BaseClass` 被一个类装饰器 `baseDecorator` 装饰,有一个子类 `SubClass` 继承自 `BaseClass` 且 `SubClass` 也被另一个类装饰器 `subDecorator` 装饰。请详细分析在实例化 `SubClass` 时,这两个装饰器的执行顺序和作用范围,并通过代码示例验证你的分析。
17.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 执行顺序和作用范围分析
    • 类装饰器在类定义时就会执行。当定义BaseClass时,baseDecorator会首先执行,它作用于BaseClass,可以对BaseClass进行一些修改,比如添加属性、方法等。
    • 当定义SubClass时,subDecorator会执行,它作用于SubClassSubClass继承自BaseClass,所以SubClass已经是被baseDecorator装饰后的BaseClass的子类。
    • 在实例化SubClass时,先执行baseDecoratorBaseClass的装饰逻辑,再执行subDecoratorSubClass的装饰逻辑。
  2. 代码示例
def baseDecorator(cls):
    print("baseDecorator is called on BaseClass")
    setattr(cls, 'base_attr', 'from base decorator')
    return cls


def subDecorator(cls):
    print("subDecorator is called on SubClass")
    setattr(cls,'sub_attr', 'from sub decorator')
    return cls


@baseDecorator
class BaseClass:
    pass


@subDecorator
class SubClass(BaseClass):
    pass


sub_obj = SubClass()
print(sub_obj.base_attr)
print(sub_obj.sub_attr)

在上述代码中:

  • 运行代码时,首先会输出baseDecorator is called on BaseClass,这是因为在定义BaseClassbaseDecorator被调用。
  • 接着输出subDecorator is called on SubClass,这是在定义SubClasssubDecorator被调用。
  • 实例化SubClass后,可以通过实例访问到base_attrsub_attr,分别验证了两个装饰器的作用。