微信小程序扩展 Page 对象
对于 iOS 开发者来说,如果需要对一个类进行扩展,第一反应就是
runtime
+category
,有了这组合,我们简直可以为所欲为,为类添加属性、方法、重写某个方法都不在话下。
在小程序中是通过 Page()
函数来注册页面的,而 page 对象就是我们所熟知的控制器。如果我们重写了系统的 Page() 函数,并修改所传递进来的 page 对象,那我们不就是达到了扩展的目的了吗。
源码
1、新建一个 js 文件,文件名随意(假设叫做 page_extension.js
),将下面的代码粘贴到该文件中
/**
* @method 扩展 Page 对象
*
* @param Page {Object} 系统原始的Page对象
* @return {function} 返回新的Page构造器
*/
function initPageExtension(Page) {
// 返回一个新的 Page 构造器
return (function (page) {
// 获取需要hook的方法, 保存方法的原始实现
const { onLoad, onUnload, onShow } = page;
/**
* @method 重写 onLoad 方法
*/
page.onLoad = function (options) {
// 可以在此直接加载模块, this.moduleA = xxxx;
if (typeof onLoad === 'function') {
onLoad.call(this, options);
}
}
/// 可以为 page 扩展任意方法, 注意别和系统的方法重名即可
page.testFunction = function() {
console.log('test function.');
}
// 调用原来的构造方法
return Page(page);
});
}
// 扩展 Page 对象
const originalPage = Page;
Page = initPageExtension(originalPage);
2、在 app.js
中引入该文件即可。
require('./utils/page_extension.js');
总结
通过重写 Page() 方法,拿到每个页面的 page 实例对象,我们就可以根据需求做各类扩展了:
- 重写 Page 系统方法,做特定的逻辑处理
- 为 Page 统一增加某个功能函数
- 统一导入某个模块,避免每个js文件都导入一遍,过于繁琐
- …
更多用途你可以自由发挥哈,我只能帮你到这了 :)