- 当使用插件时候,数组不能通过修改原型覆盖数组方法
- 当前 Bug 的表现(可附上截图) 当使用插件时候,数组不能通过修改原型覆盖数组方法。造成`mpvue`等基于响应式数组的框架运行不正常 TL;DR 根据下面运行情况,猜测:在微信小程序使用插件时候,数组创建时候,数组的方法会被重新赋值一次,而不是原型继承,造成使用[代码]__proto__[代码]继承的[代码]Vue[代码]响应式数组没法按预期执行。 分别在未使用插件和使用插件(App.json中有plugins字段)的情况下执行下面代码 [代码]const arrayProto = Array.prototype[代码][代码]const arrayMethods = Object.create(arrayProto)[代码][代码]Object.defineProperty(arrayMethods, [代码][代码]'push'[代码][代码], { [代码][代码] [代码][代码]value(...args) {[代码][代码] [代码][代码]console.log([代码][代码]'Modified push'[代码][代码], args)[代码][代码] [代码][代码]}, [代码][代码] [代码][代码]enumerable: [代码][代码]false[代码][代码],[代码][代码] [代码][代码]writable: [代码][代码]true[代码][代码],[代码][代码] [代码][代码]configurable: [代码][代码]true[代码][代码]})[代码][代码]arrayMethods.aaaaaa = [代码][代码]'arrayMethods'[代码] [代码]// 做个标记[代码][代码]const foo = [];[代码][代码]foo.__proto__ = arrayMethods[代码][代码]foo.push(100) [代码][代码]// 未使用插件: Modified push ; 使用插件: 和Array.prototype.push一样[代码]这时候可以打印下[代码]foo[代码]变量 未使用插件的foo [图片] 使用插件的foo [图片] 由上可知,使用插件时候,所有数组实例都会直接挂载数组方法(覆盖隐式原型__proto__没用) 另外如果你去打印[代码]foo.__proto__ === arrayMethods[代码],值是true,不过隐式原型并没有被覆盖(这不重要哈) foo.__proto__ === arrayMethods // true源码(core/observer/index.js#L48-L51)可知[代码]Vue[代码]在覆盖数组方法时候,会有两种情况 如果支持隐式原型(即[代码]hasProto = '__proto__' in {}[代码]为true),则通过覆盖隐式原型 否则,直接覆盖数组对象方法 无论在什么情况下,小程序[代码]hasProto[代码]都为true,但又无法通过覆盖隐式原型,把数组方法替换为响应式方法,因此造成响应式数组没法按预期执行 - 预期表现 与未使用插件的小程序表现一致 - 复现路径 - 提供一个最简复现 Demo 相关issue: https://github.com/Meituan-Dianping/mpvue/issues/1554 [代码]const arrayProto = Array.prototype[代码][代码]const arrayMethods = Object.create(arrayProto)[代码][代码]Object.defineProperty(arrayMethods, [代码][代码]'push'[代码][代码], { [代码][代码] [代码][代码]value(...args) {[代码][代码] [代码][代码]console.log([代码][代码]'Modified push'[代码][代码], args)[代码][代码] [代码][代码]}, [代码][代码] [代码][代码]enumerable: [代码][代码]false[代码][代码],[代码][代码] [代码][代码]writable: [代码][代码]true[代码][代码],[代码][代码] [代码][代码]configurable: [代码][代码]true[代码][代码]})[代码][代码]arrayMethods.aaaaaa = [代码][代码]'arrayMethods'[代码] [代码]// 做个标记[代码][代码]const foo = [];[代码][代码]foo.__proto__ = arrayMethods[代码][代码]foo.push(100) [代码][代码]// 未使用插件: Modified push ; 使用插件: 和Array.prototype.push一样[代码]
2019-05-27 - 我的小程序名称、简介、图标被清空是为什么?
小程序原名“世界杯2018助手” [图片]
2018-06-15 - 为什么代码发布审核未通过,提示小程序实际所提供的服务属于尚未开放的服务类目
为什么代码发布审核未通过,提示小程序实际所提供的服务属于尚未开放的服务类目,就一赛程信息查询小程序
2018-06-07 - 最新的开发者工具(v1.02.1805150)使用的nwjs是什么版本?
如题, 当前微信开发者工具最新版本(1.02.1805150)使用的nwjs是哪个版本呢?今后是否可以在更新信息中说明~~
2018-05-15 - onLoad options参数是否解码真机和开发者工具不一致
如下代码 [代码]wx.navigateTo({ [代码][代码] [代码][代码]url: [代码][代码]'/pages/profile?a=123&c=+123&d='[代码][代码]+encodeURIComponent([代码][代码]'https://www.food.com/m哈哈l.html'[代码][代码])[代码][代码]});[代码] 在真机(iOS 11.0.3 WeChat 6.5.19)中,onLoad的options参数返回的是未decode的值 [图片] [图片] 在开发者工具(mac v1.01.171019;基础库 1.5.4)中返回的是decode之后的值 [图片] 在文档-api-导航中没有发现相关的说明,哪个是正确的表现?还有传递参数文档只说到使用key=value形式,并没有说明URI编码的规则,请问如何编码? PS: 没有路由标签。。。。
2017-10-24