收藏
回答

小程序如何挂载一个类似 wx 这样的全局对象?

背景

想做一个类似 pollyfill 的通用方法,以兼容微信、支付宝、百度小程序三者的 API 调用,因为三者之间部分 API 是有细微区别的。

不想每次都改一遍,然后有些转换工具转化效果还是不够理想,自己用 Gulp 写的脚步也不能完全兼容。

如果写了 pollfill 的话,也方便统一管理、维护。

想法 & 不足

将其挂载到 global 对象或者导出 ESM 模块,但是这种方式仍需要在使用之前,先引入。

求助

有没有一个方法可以直接调?像 wx 这个对象,我们可以在任何地方随时调用。例如 wx.chooseImage。

比如我将 mini 作为自定义的全局对象, 然后也想在任何地方通过 mini.xxx 来调用,如 mini.chooseImage

其他思路

看过别人一方法,可真机上不行,因为在真机上 this 为 undefined,如下:

Object.defineProperty(Object.prototype, '__root', {
  get() {
    if (this && this.App === App) {
      return this
    }
  },
  configurable: false,
  enumerable: false
})

// 使用
// __root.xxx
最后一次编辑于  2021-01-20
回答关注问题邀请回答
收藏

4 个回答

  • _晚风
    _晚风
    2021-04-09
    Object.defineProperty(Object.prototype, '__root', {
      get() {
        let obj = {}
        obj.print = functon(msg){
          console.log(msg)
        }
        return obj
      },
      configurable: false,
      enumerable: false
    })
    // 使用
    // __root.print('hello world')
    
    2021-04-09
    有用 2
    回复 1
    • 2023-04-22
      请问页面里的wx:for wx:if wx:key这里面的wx,有办法像js那样统一的方法吗?
      2023-04-22
      回复
  • brave
    brave
    2021-01-20
    getApp().xxxx 
    
    2021-01-20
    有用 1
    回复 2
    • 慢慢。
      慢慢。
      2021-01-20
      这种就是挂载到 app 对象上,这种方式不够优雅,哈哈
      2021-01-20
      回复
    • brave
      brave
      2021-01-20回复慢慢。
      实际上你不就想 xxx.xxx 吗 纠结那么多干嘛
      2021-01-20
      回复
  • 小包
    小包
    2022-08-05
    // 在app.js最顶部挂上全局baby变量,之后就可以在没个页面直接调baby.
    
    Object.defineProperty(Object.prototype, 'baby', {
      value: {
        sayHello() {
          wx.showToast({
            icon: 'none',
            title: 'hello',
          })
        }
      },
      configurable: false,
      enumerable: false
    })
    
    baby.sayHello();
    


    2022-08-05
    有用
    回复
  • MAN
    MAN
    2021-01-22

    类似这种直接挂载到字符串的原型上,然后通过 'xx'.xxx,写一个字符串去调用就好了

    2021-01-22
    有用
    回复
登录 后发表内容
问题标签