2012-03-04 76 views
1

我写一个小班级,为什么这不工作,我不明白这一点:的JavaScript:面向对象的功能不存在(不是函数)

var Browsertest = { 

    isIE: /MSIE (\d+\.\d+)/.test(this.getUserAgent()), 

    getUserAgent: function() { 
     return navigator.userAgent; 
    } 

}; 

console.log(Browsertest.isIE); 

我得到的错误getUserAgent()不存在/可用(在IE9和其他浏览器中)。

+0

用户代理检测应谨慎使用,特征检测是更好的方式:) – pomeh 2012-03-04 17:11:51

回答

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); 
+0

'this'仍然解析为全局对象,没有(第一个例子)? – 2012-03-04 16:51:35

+0

你的第一个解决方案将是最好的,但它甚至不工作:我得到相同的错误信息:'this.getUserAgent不是一个函数' – Poru 2012-03-04 16:54:20

+0

@Poru这就是我刚才所说的...... – 2012-03-04 16:56:08

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()); 
1

要调用在this解析为全局对象的地方this.getUserAgent

+0

这不是他的脚本的第一个问题,但它也是一个问题,很好的抓住:) – pomeh 2012-03-04 16:52:54

+0

是的,'navigator.userAgent',大写变量名称为一个简单的对象,等等...我知道:( – 2012-03-04 16:55:38

+0

我不得到它,你有什么意见? – pomeh 2012-03-04 16:57:55

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) 
}; 
+0

看看他在Xander的答案下的评论,第一个例子不会工作... – 2012-03-04 17:03:30