在线测试

function SuperCall() {
  return (target: any, key: string, descriptor: PropertyDescriptor) => {

    let obj = Object.getPrototypeOf(target);

    const bases = [];
    //获取所有的父级,直到父级不是Object时
    while(obj.constructor.name !== "Object")
    {
      bases.push(obj);
      obj = Object.getPrototypeOf(obj);
    }

    //调用所有父级的同名方法,从根父级开始
    while(bases.length > 0)
    {
      const base = bases.pop();
      base[key]();
    }
  }
}

abstract class Foo {

  public f1() {
    console.log("Foo")
  }

  
}

class Boo extends Foo {
f1()
{
  console.log("Boo")
}

}

class Moo extends Boo {
  //调用所有父级的f1方法,在对象创建时就会调用
  @SuperCall()
  f1()
  {
    console.log("Moo")
  }
}

const bb = new Moo();//会调用所有的SuperCall
bb.f1();//调用自己的方法