object.js源码实现有漏洞,麻烦引擎组大大们看下

  • Creator 版本: 最新的2.4.6分支仍存在

  • 目标平台: Web

  • 重现方式:源码使用解构赋值 const x = {…{a: 1, b: 2}, callback: ()=>{}}; console.log(x);

  • 首个报错: 在低于45的Chrome内核WebView里,编码后运行,x会丢失callback参数。

  • 之前哪个版本是正常的: 从19年到现在的2.4.6引擎,代码都有问题

  • 手机型号:

  • 手机浏览器:

  • 编辑器操作系统:

  • 重现概率: 必现

上述代码编译后,长这样:n({}, {a: 1, b: 2}, {callback: function(){}}),其中,n是编译后的方法,用于实现Object.assign的功能,长这样:

n =
(this && this.__assign) ||
function() {
return (n =
Object.assign ||
function(t) {
for (var e, o = 1, i = arguments.length; o < i; o++)
for (var n in (e = arguments[o]))
Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]);
return t;
}).apply(this, arguments);
}

this指向的是window,this.__assign貌似是在typescript.js里赋值的。优先使用Object.assign返回。

上述代码,正常情况下没问题,问题出在引擎源码中,又在object.js里,对Object.assign做了赋值(有了这段,上面__assign的后面那个function,其实就没用了,因为Object.assign一定有值)。

该问题的原因,是cc.js.mixin支持任意数量的参数,但这里,只取了前两个,导致第三个及以后的参数不会被合并。

麻烦引擎组修复一下吧,毕竟测试还是会找一些下载不了X5内核的安卓机进行测试的。。。

附Object.assign兼容性列表 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

1赞

看起来很niub,帮你顶顶

手动置顶下吧 @jare