在线测试
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();//调用自己的方法