装饰器在编译es6后target、target.prototype是{}
来源:7-1 创建控制器和装饰器

莜紫兮
2021-11-05
import "reflect-metadata";
function tControll(target: any) {
for (let key in target.prototype) {
console.log(Reflect.getMetadata("path", target.prototype, key));
}
}
function get(path: string) {
return function (target: any, key: string) {
Reflect.defineMetadata("path", path, target, key);
};
}
@tControll
class controller {
@get("/")
getName() {
console.log("lisi");
}
}
老师为什么这段代码在编译成es6后 tControll 没有输出呢?
写回答
2回答
-
qq_慕运维0573241
2022-04-13
// 这样的写法在编译成es2016的情况下无效 // 因为class的内部所有定义的方法,都是不可枚举的,与 ES5 的行为不一致 for (let key in target.prototype) { const data = Reflect.getMetadata('data', target.prototype, key) console.log(data) } // 编译成es2016的情况 可以这样写 Object.getOwnPropertyNames(target.prototype).forEach((item: string) => { // 排除默认的constructor属性 if (item !== 'constructor') { const data = Reflect.getMetadata('data', target.prototype, item) console.log(data) } })
342025-01-08 -
Dell
2021-11-05
会影响代码执行吗
022021-11-05
相似问题