子类继承父类,并且重写同名方法覆盖父类,在同名方法中使用tween动作,cc.tween().call(()=>{this._super})瞬时动作中调用_super为什么是null

  • Creator 版本: <2.4.2>

  • 目标平台: <Chrome浏览器web运行测试>

  • 重现方式:子类继承父类重写覆盖父类方法,并在方法中的瞬时动作中调用this._super

  • 首个报错: <>

  • 之前哪个版本是正常的:

  • 手机型号:

  • 手机浏览器:

  • 编辑器操作系统:

  • 重现概率:

this._super();不能放在匿名函数内,匿名函数会被编译成非匿名函数,而 this._super()就成了调用父类的同名匿名函数,这在父类里哪里有啊

但是我直接定义匿名函数(()=>{this._super})(),调用就是正确的调用了父类的方法,,只有在瞬时动作里_super才变成了null,而且this上的其他声明的属性都可以调用,为什么单单_super是null呢,,,同样就算是在外边声明let self = this; 瞬时动作中的self._super依然是null的,打印的this指向并没有变化只是_super没有了变成了null

具体原因我也不清楚,这可能和给匿名函数新名字时的规则有关系,你传给回调的匿名函数和原地定义匿名函数在获得名字时可能前面的新名字就和当前函数的名字一样,而回调里的则加上了有关回调的信息,这只是我的猜测

还有可能(()=>{this._super})()会被编译优化成 this._super()

应该是封装成瞬时动作造成的,我还在翻瞬时动作的源码,希望有大佬帮我解释一下 :joy:

我是用这种方式的 父类.prototype.函数名.apply(this)

我知道绕过_super可以实现等价的调用,,但我现在想知道的是为什么_super不存在

不太清楚。。。因为未经过构建的脚本混淆的时候_super的属性也是无效的,感觉像是引擎翻译脚本的时候_super自动转化的机制问题。

_super只在类方法被调用时有效, 延时动作里已经不存在了.
可以尝试将_super存下来, 再在动作里使用.


哦哦 也就是说_super只能存在于调用类方法的当前帧,只要经过延时就不存在了

类方法执行结束时就不存在了.

混淆时无效, 是因为引擎通过正则匹配._super决定要不要注入_super, 而混淆后this._super变成了this["_super"]或者其它形式, 从而没有注入.

原来是这样

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。