【装饰器】类装饰器打包之后获取类型会被压缩成e

怎么获取类名,打包成微信小游戏后装饰器获取类名会变成E,cc.js.getClassName也是e

1赞

干掉这个需求

每个类加一个函数返回类名,或者加一个修饰属性,写上类名字符串,就好了。

[Cocos Creator]获取类名

看看这个 能否解决你的问题

在当前脚本使用装饰器 然后装饰器函数里cc[’_RF’].peek().script是拿到脚本名称吧 cc[’_RF’].peek().exports.default.name也只能拿到当前脚本默认导出类的名称吧 打印其它导出类都是undefind有谁知道是怎么回事吗

ps: 混淆后想要拿到原始类名是不是所有方法都逃不开先自己储存再获取啊 那不还是老老实实cc.js.set/getClassName :rofl:

没有用ccclass吧,我项目里面用js.getClassName是可以拿到的

1赞

楼上说的对,ccclass装饰器可以解决这个问题

针对自定义类怎么搞一个自己的customClass装饰器 也像@ccclass一样可以不用传类名字符串呀 水平不够看不懂源码 :joy:

好嘛 :rofl: 硬着头皮翻开源码看
结果@ccclass还是需要主动传入字符串作类名的

不传的话底层就是拿cc['_RF'].peek().script当类名
然后cc.js.setClassName储存起来
但是cc.js.getClassName拿到的实际上是脚本名

那么问题来了 类装饰器函数里调用cc[’_RF’].peek().exports拿到当前脚本模块导出对象
里面可以看到除了default外还有其它导出类 本来打算用笨办法拿目标类一个个去对比的 但是打印cc[’_RF’].peek().exports.xxxClass发现都是undefined 有谁知道是怎么回事吗

最后的最后 业务代码里依赖类名 构建混淆后真的是新手两行泪啊 :sob: 虽然我现在是勾了调试模式逃避一下问题 但如果能有好法子解决就好了 求助论坛大神们

自顶一下…

let countDecorator = 0
export function ccExDecorator(target: any) {
let frameInfo = cc[’_RF’].peek();
let script = frameInfo.script;
cc.js.setClassName(script, target);
countDecorator++
// console.log(“smile----:”+countDecorator, JSON.stringify(script));
}

image

详细可以参考 : Cocos Creator游戏开发|PureMVC

smile不起来 cc[’_RF’].peek().script是当前类所在脚本的名字 不一定一个脚本就一个类啊 也不一定类的名字和脚本名字一样啊。。不然就像楼上说的直接@ccclass就可以解决 自定义类就算不传字符串 @ccclass底层也是一样用cc[’_RF’].peek().script拿脚本名当类名

当然你说一个脚本就放一个类而且命名一致能用那也行 但是拿脚本名当类名这种做法本身是不是就不严谨 那还不如cc[’_RF’].peek().exports.default.name 拿到默认导出类的类名是不是更加严谨? 这样除了export default的这个类可以默认不用手动传类名字符串 同个脚本里其它类如果也需要储存类名那就手动传一下 这样会不会更严谨一点

还有什么解决办法吗

image
image
睡不着又搞了下 可以做到使用自定义类装饰器不用手动传类名字符串了

用的还是引擎底层的cc['_RF'].peek().exports.xxxClass 只不过发现获取到的类都是undefind 但是打印出来是能看到 那应该就是异步的问题了 不过好像Class.name本来就是只读不能修改的 那就扩展一个新的属性返回原始类名好了 私有属性标识符看着挺顺眼的就用它当前缀符号了 :rofl: :rofl: :rofl:

解决了, let frameInfo = cc[’_RF’].peek();
let script = frameInfo.script;
cc.js.setClassName(script, target);

这样显得我发这么多很呆 :joy:

谢谢你的回答,很详细,新的知识get到了,之前也很困惑这个,上面的回复很详细

感谢大佬的肯定 :rofl: