如何创建或扩展全局对象



我正试图从外部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

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

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

尝试以下代码

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

看看这篇关于默认参数的文章。

最新更新