2012-03-04 6 views
1

내가 조금 클래스를 쓰고이 작동하지 않는 이유를 나는 그것을 얻지 않는다 (기능 없음) :자바 스크립트 : 객체 지향 기능은 존재하지 않는

var Browsertest = { 

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

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

}; 

console.log(Browsertest.isIE); 

을 나는 오류는 getUserAgent()가 존재하지 않거나 사용 가능합니다 (IE9 및 다른 브라우저에서).

+0

사용자 에이전트 감지는주의해서 사용해야합니다, 특징 검출은 더 나은 방법입니다 :) 아직까지 해결 this' – pomeh

답변

4

정의되기 전에 getUserAgent 함수를 호출하고 있습니다. object literals을 사용할 때 인스턴스 멤버를 사용하기 전에 정의해야합니다.

두 대안 ...

하나 :

var Browsertest = { 
    getUserAgent: function() { 
     return navigator.userAgent; 
    }, 

    isIE: function() { return /MSIE (\d+\.\d+)/.test(this.getUserAgent()); } 
}; 

console.log(Browsertest.isIE()); 

2 : 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

' 거기에 전역 개체, 안돼 (첫 번째 예)? –

+0

첫 번째 해결 방법이 가장 좋지만 작동하지 않습니다. 동일한 오류 메시지가 표시됩니다. 'this.getUserAgent는 함수가 아닙니다.' – Poru

+0

@Poru 방금 말한 것입니다 ... –

4

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

이것은 그의 스크립트의 첫 번째 문제가 아니지만 좋은 캐치 (catch) 문제입니다. – pomeh

+0

예, navigator.userAgent', 간단한 개체의 대문자 변수 이름 ... 알아요 :( –

+0

그것을 얻으십시오, 당신의 요점은 무엇입니까? – pomeh

0

글쎄, 요점을 지적하고 싶습니다. 사용자 에이전트를 더 이상 사용하지 말아주세요. 요즘에는 매우 싫은 냄새가납니다. 귀하의 질문에 See This link for more info why UA sniffing is bad

답변 : 당신이 isIE 방법 전에 getUserAgent 방법을 선언하는 경우 그것은 작동합니다. 이 분석 될 때이 표현되지 함수 선언 때문에

/MSIE (\d+\.\d+)/.test(this.getUserAgent()) 

가 바로 실행된다 : 때문에
var Browsertest = { 
    getUserAgent: function() { 
     return navigator.userAgent; 
    }, 

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

이다. 따라서 getUserAgent에 대해서는 알지 못합니다. 그 방법은 아직 파싱되지 않았기 때문입니다.

는 그러나 방법 getUserAgent 중복, 그래서 당신은이처럼 쓸 수있다 :

var Browsertest = { 
    isIE: /MSIE (\d+\.\d+)/.test(navigator.userAgent) 
}; 
+0

Xander의 대답에 따르면 첫 번째 예는 작업... –