是否可以在 JavaScript/jQuery 中制作组合对象?

Is it possible to make a composed object in JavaScript/jQuery?

提问人:Hoshi 提问时间:11/20/2020 更新时间:11/20/2020 访问量:24

问:

我正在构建一个特定于站点的库,我想将其作为单个文件进行维护,但使用统一的 API 进行部署。

web = (function($){

  function web(opts) {
    this.id = otherLibrary.sniffID(opts.cipher);
    this.args = parseParams();
    if( opts.hide && opts.hide == true ) {
      $(`#${opts.frameid}${this.id}).hide();
    }
    return this;
  }
  function parseParams() {
    var sk = {};
    var x = location.search;
    var y = x.substring(x.indexOf('?')+1);
    var z = y.split('&');
    for (var i of z) { 
      m = i.split('='); 
      if( m[1] != undefined ) {
        if (['true','false'].includes(m[1]) ) {
          sk[m[0]] = eval(m[1]);
        } else {
          sk[m[0]] = decodeURIComponent(m[1]); 
        }
      } else {
        sk[m[0]] = true;
      }
    }
    return sk;
  }

  return minn;

})(jQuery);

但是当我将另一个文件连接到发行版中时,我遇到了范围问题。

/** JS Helpers */
web.js = (function ($) {
  function debounce(func, wait) {
    var timeout;
    return function () {
      var context = this, args = arguments;
      var later = function () {
        timeout = null;
        if (!immediate) func.apply(context, args);
      };
      clearTimeout(timeout);
      timeout = setTimeout(later, wait);
    };
  };

  return {
    debounce: debounce
  }
})(jQuery);

在客户端代码中,我这样做:

var myWeb = new web({cipher: getCipher(), frameID: this.frame.id});
if( myWeb.args.localizeData ) {
  load('dictionary');
}
window.on('resize', myWeb.js.debounce(onResize));       // fails!

而且,当然,最后一行不起作用 - 我必须使用静态引用 ,这意味着密钥路径中隐含的集装箱船是假的,它不是一个对象,而是 2 个对象。web.js.debounce

有没有一种模式可以做我想要的事情,让一个对象及其 API 从多个独立文件构建并组装起来进行分发?也许换一种说法:是否可以躲避类型的jQuery对象?有没有办法在它们之间共享状态,例如,是否可以在语句中传递引用?web.user.emailopts.fromAddressnew web(opts)

jquery 范围 闭包 共享库 鸭子类型

评论


答: 暂无答案