creator ts项目都会大范围使用 ccclass 装饰器。
我自己手动创建一个类装饰器,目的是获取类名然后注册。
let ClsPool:any = {};
// ts文档规定类装饰器无法传参数
export function regisThemeCls(constructor: Function) {
console.log("regisThemeCls",constructor,constructor.prototype,constructor.__proto__)
if (!constructor.__proto__ || !constructor.__proto__.name){
cc.log("ThemeFactory 无法注册",constructor);
return;
}
let baseClsName:string = constructor.__proto__.name;
let clasName:string = constructor.name;
if ( ClsPool[baseClsName] || ClsPool[clasName] ){
cc.warn(`存在类注册冲突, baseClsName = ${baseClsName} clasName = ${clasName}`);
console.log(constructor);
}
ClsPool[baseClsName] = constructor;
// cc.log("baseClsName "+baseClsName +" clasName "+clasName)
}
然后定义TS类时,在类声明前加上 @ regisThemeCls
。
这种写法在调试模式(包括构建情况的调试)都没有问题,但是去掉调试模式就完全错了,所有的类都被creator编译器改造,只能读取到t和e变量。
creator 自带的ccclass是用js写的不太懂 ,特别是 checkCtorArgument方法找不到出处。
v1.8.1版本
不太理解为什么会变成这样,官方麻烦帮忙解释一下可以吗。