2012-03-04 74 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