我正在写一个小班,我不明白为什么这不起作用:
var Browsertest = {
isIE: /MSIE (\d+\.\d+)/.test(this.getUserAgent()),
getUserAgent: function() {
return navigator.userAgent;
}
};
console.log(Browsertest.isIE);
我收到getUserAgent()
不存在/可用的错误(在IE9和其他浏览器中)。
答案 0 :(得分:4)
您在定义之前调用getUserAgent
函数。使用object literals
时,需要在使用实例成员之前对其进行定义。
两种选择......
<强>一:强>
var Browsertest = {
getUserAgent: function() {
return navigator.userAgent;
},
isIE: function() { return /MSIE (\d+\.\d+)/.test(this.getUserAgent()); }
};
console.log(Browsertest.isIE());
<强>两个强>
var Browsertest = new function() {
var that = this;
this.getUserAgent = function() {
return navigator.userAgent;
};
this.isIE = /MSIE (\d+\.\d+)/.test(that.getUserAgent());
};
console.log(Browsertest.isIE);
答案 1 :(得分:4)
由于isIE
被定义为getUserAgent()
之前的属性,因此您必须将其定义为函数而不是标量:
var Browsertest = {
isIE: function() {
return /MSIE (\d+\.\d+)/.test(this.getUserAgent());
},
getUserAgent: function() {
return navigator.userAgent;
}
};
// Call it as a function
console.log(Browsertest.isIE());
答案 2 :(得分:1)
您在this.getUserAgent
解析为全局对象的地方呼叫this
。
答案 3 :(得分:0)
首先我要指出,请不要再使用用户代理嗅探,这些天它非常皱眉。 See This link for more info why UA sniffing is bad
回答你的问题: 如果在isIE方法之前声明getUserAgent方法,它将起作用。
var Browsertest = {
getUserAgent: function() {
return navigator.userAgent;
},
isIE: /MSIE (\d+\.\d+)/.test(this.getUserAgent())
};
这是因为:
/MSIE (\d+\.\d+)/.test(this.getUserAgent())
在解析时立即执行,因为它是表达式,而不是函数声明。因此它不了解getUserAgent,因为该方法尚未被解析。
但方法getUserAgent是多余的,所以你也可以这样写:
var Browsertest = {
isIE: /MSIE (\d+\.\d+)/.test(navigator.userAgent)
};