如何创建或扩展全局对象

时间:2018-11-16 01:55:06

标签: javascript object

我正在尝试从外部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: (intermediate value)(...) is not a function

我在这里想念什么?

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

编辑

我根据以下答案编写了代码:

  ;(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 is undefined; can't access its "getBar" property

2 个答案:

答案 0 :(得分:3)

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

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当作您要在后面的(...)中调用的函数对象

也喜欢

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 || {})

答案 1 :(得分:1)

尝试以下代码

(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
  })()

请查看此article的默认参数。