我正在尝试从外部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
答案 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的默认参数。