小程序中的App、Page、global三者的关系
发布于 6 年前 作者 yangzhang 19398 次浏览 来自 问答

场景

在某些场景下,我们需要覆盖App或Page做一些自定义处理,就像web开发中我们经常覆盖XMLHttpRequest对象一样。

global.App = function CustomApp(...args) {
 
    // 扩展逻辑...
 
    App(...args)
 
}

遇到的问题

如果未关闭“ES6转ES5”,以上的写法会报错“Maximum call stack size exceeded

这个好理解,因为执行`App(…args)`时,App已经指向了`CustomApp`,是一个死循环。

但是,如果启用“ES6转ES5”,则不报错。

启用“ES6转ES5”之后,global是这样一个对象(不包含App、Page):

{
    "process": {
        "env": {}
    },
    "__core-js_shared__": {
        "versions": [{
                "version": "2.5.7",
                "mode": "pure",
                "copyright": "© 2018 Denis Pushkarev (zloirock.ru)"
            }],
        "keys": {
            "IE_PROTO": "Symbol(IE_PROTO)_1.npx70g8i3j"
        },
        "wks": {
            "toStringTag": "Symbol(Symbol.toStringTag)_2.npx70g8i3j",
            "iterator": "Symbol(Symbol.iterator)_3.npx70g8i3j",
            "species": "Symbol(Symbol.species)_4.npx70g8i3h"
        }
    }
}

疑问

1、为什么是否启用“ES6转ES5”,global对象不一致?

2、启用“ES6转ES5”之后,global对象不包含App、Page,那么App、Page指向谁(挂载在哪里)?

2 回复

不要使用global,如果你想覆盖App或Page构造器的话,可以直接重新赋值给Page或App,但是并不是很推荐这么做。你可以直接封装一个新的构造器,比如 module.exports = function MyApp(args) { App(args) } 这样的。

感觉我们平明百姓好可怜哦

回到顶部