Javascript 如何创建或扩展全局对象

Javascript 如何创建或扩展全局对象,javascript,object,Javascript,Object,我试图从一个外部JS文件扩展一个对象,该文件加载到一个可能存在相同对象名的页面中 我已在全局范围内拥有一个对象: window.Qo = {} window.Qo.myvar = 1 我需要包括一个JS文件,如果它确实存在,将扩展它,如果不存在,则创建它 (function(Qo) { Qo.prototype.var2 = 2 function secretFn(value) { return value } Qo.prototype.pu

我试图从一个外部JS文件扩展一个对象,该文件加载到一个可能存在相同对象名的页面中

我已在全局范围内拥有一个对象:

window.Qo = {}
window.Qo.myvar = 1
我需要包括一个JS文件,如果它确实存在,将扩展它,如果不存在,则创建它

  (function(Qo) {
    Qo.prototype.var2 = 2

    function secretFn(value) {
      return value
    }

    Qo.prototype.public = function(value) {
      console.log(value)
      return value
    }
    return Qo
  })(window.Qo = window.Qo || {})
据我所知,最后一行是,如果函数存在,则传递给函数的对象是
window.Qo
,如果不存在,则为空对象

但是,尝试扩展原始对象时,即使我将函数传递给
myvar
,也会出现错误,即该值不是函数

TypeError:(中间值)(…)不是函数

我错过了什么

另外,在未知/不受信任的第三方网站上包含全局对象时,是否还有其他需要检查的内容

编辑

我根据下面的答案编写了一个代码:

  ;(function(Qo) {
      // Private variable
      var _bar;

      // Private function
      function _atob(value) {
        if(!typeof value === 'undefined')
        return atob(value)
      }
      // Public functions
      Qo.prototype.getBar = function() {
          return _bar;
      };
      Qo.prototype.setBar = function(bar) {
          _bar = bar;
      };

      return Qo;
  })(window.Qo = window.Qo || {})

  Qo.setBar('test')
错误:
TypeError:Qo.prototype未定义;无法访问其“getBar”属性

请尝试下面的代码

(function(Qo = window.Qo || {}) {
    Qo.prototype.var2 = 2

    function secretFn(value) {
      return value
    }

    Qo.prototype.public = function(value) {
      console.log(value)
      return value
    }
    return Qo
  })()
看看这个默认参数

试试下面的代码

(function(Qo = window.Qo || {}) {
    Qo.prototype.var2 = 2

    function secretFn(value) {
      return value
    }

    Qo.prototype.public = function(value) {
      console.log(value)
      return value
    }
    return Qo
  })()

看看这个默认参数

您可能需要在发布的代码前面加一个分号。 自

js将把
任何前面的表达式
视为一个函数对象,您希望使用下面的
(…)

所以你喜欢做某事

whateverPrecedingExpression
;(function(Qo) {
    Qo.prototype.var2 = 2

    function secretFn(value) {
      return value
    }

    Qo.prototype.public = function(value) {
      console.log(value)
      return value
    }
    return Qo
  })(window.Qo = window.Qo || {})

可能您需要在发布的代码前面加一个分号。 自

js将把
任何前面的表达式
视为一个函数对象,您希望使用下面的
(…)

所以你喜欢做某事

whateverPrecedingExpression
;(function(Qo) {
    Qo.prototype.var2 = 2

    function secretFn(value) {
      return value
    }

    Qo.prototype.public = function(value) {
      console.log(value)
      return value
    }
    return Qo
  })(window.Qo = window.Qo || {})

谢谢你的建议,检查更新的问题。我仍然有一个错误:
TypeError:Qo.prototype未定义;无法访问其“getBar”属性
:/谢谢您的建议,请检查更新的问题。我仍然有一个错误:
TypeError:Qo.prototype未定义;无法访问其“getBar”属性
:/我也尝试过此方法(在更新问题之前),它也不起作用<代码>类型错误:Qo.prototype未定义;无法访问其“var2”属性我也尝试过这个方法(在更新问题之前),它也不起作用<代码>类型错误:Qo.prototype未定义;无法访问其“var2”属性