想收集一些统计数据,需要重写setData方法。看文档中有Page.prototype.setData。打算如下操作
const originSetData = Page.prototype.setData;
Page.prototype.setData = function (e, c) {
// 做一些记录,统计操作
console.log('记录操作');
originSetData.apply(this, arguments)
}
按照如上操作后,并没有成功。输出Page.prototype.setData,显示为undefined,请问各位有什么方法可以重写setData么
// 重写page // utils/page.js const myPage = Page module.exports = function (e) { let { onLoad } = e e.onLoad = (onLoad => { return function (res) { let { setData } = this Object.defineProperty(this.__proto__, 'setData', { configurable: false, enumerable: false, value(...param){ // 做一些记录,统计操作 console.log('记录操作'); return setData.apply(this, param) } }) onLoad && onLoad.call(this, res) } })(onLoad) return myPage.call(this, e) }
// 在app.js引入utils/page.js Page = require('./utils/page.js') App({ onLaunch: function () { } })
// pages/index/index.js Page({ onLoad: function (options) { this.setData({ xxx: 111 }) } }
不知道为啥文档这么写,不过 Page.prototype 和 页面里的this无关,毕竟你又不是 new Page这样来初始化的页面。
this是一个xxx.default的方法 new 出来的对象,这个对象在外面拿不到。你只能在页面onLoad的时候修改 this.__proto__.setData
请学会如何「提问」(👈戳我)
这个能改?
请学会如何「提问」(👈戳我)
function (data) {
const originOnLoad = data.onLoad;
data.onLoad = function() {
const originSet = this.setData;
console.log('newOnLoad')
this.setData = function(e, t) {
console.log('newSet');
originSet.apply(this, arguments)
}
originOnLoad.apply(this, arguments)
}
Page(data);
}
}
这么改了一下,可以实现了