JavaScript:面向对象的函数不存在(不是函数)

时间:2012-03-04 16:45:25

标签: javascript javascript-objects

我正在写一个小班,我不明白为什么这不起作用:

var Browsertest = {

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

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

};

console.log(Browsertest.isIE);

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

4 个答案:

答案 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)
};