2013-07-26 3 views
6

모든베이스의 로그를 계산하는 javascript의 Math 개체에서 메서드가 필요합니다. 기본적으로 내가 한 일은 다음과 같습니다.자바에서 수학에 메서드를 추가하려면 어떻게해야합니까?

Math.log_b=function(b,x){return Math.log(x)/Math.log(b);} 

이와 같은 기본 제공 기능을 확장 할 경우의 단점은 무엇입니까?

제 상황을 좀 더 명확하게하기 위해 사용자 입력을 받아 적절한 수학 개체 함수 이름으로 바꾸고 계산을 위해 eval에 전달합니다. 이것이 명확하지 않으면 내 딜레마가 내 경우에 eval (악의적이라고해도)을 사용해야하고 수학 함수를 확장하는 것이 내 경우에 가장 적합합니다.

이런 내장 기능을 확장하거나 이상한 정상적인 일을 할 때 이상한 버그가있을 수 있습니까?

+0

Math() 생성자가 없으므로 프로토 타입을 만들 수 없습니다. 수학 함수는 객체의 메서드가 아닌 함수 일뿐입니다. – defaultNINJA

+0

예, 프로토 타입을 작성할 수 없습니다. –

+0

@Jack_of_All_Trades 예, 프로토 타입을 작성할 수 있습니다. 내 대답을 보라. – Neal

답변

6

소유하지 않은 것을 수정해서는 안됩니다.

  • 사용 다른 플러그인 또는 제 3 자 코드가 완전히 다른 서명을 제공 Math-log_b의 자신의 버전을 추가하면 어떻게됩니까?

  • 향후 버전의 자바 스크립트가 log_b의 버전을 Math에 정의한다면 어떻게 될까요?

사람 때문에 사람를 들어, 울 것입니다 그것은 늘 그들이 그것을 기대하지. Math가장 적합한 경우을 확장하는 이유


잘 모르겠어요.

function my_log_b(b,x){return Math.log(x)/Math.log(b);} 

... 여전히 귀하의 경우에 맞는 것 같습니다. 더 좋은 점은 자신의 네임 스페이스를 정의하고 거기에 넣는 것입니다.

if (Math.__proto__) { 
    Math.__proto__.log_b=function(b,x){ return this.log(x)/this.log(b); } 
} 
else { 
    alert('Cannot prototype `Math`'); 
} 

을하지만 당신 덮어 쓰기를 할 수있는 브라우저 코드에서 아마도 가장 좋은 생각이 아니다 :

var ME = {}; 

ME.log_b = function (b,x){return Math.log(x)/Math.log(b);} 
+0

+1에 대한 포인터 – exexzian

+0

명확한 답변을 주셔서 감사합니다. 정말로 나에게 도움이된다! –

0

당신은 그것을 프로토 타입 할 수 있습니다.

자신이 만든 개체에이 메서드를 추가하는 것이 좋습니다.

+0

이 질문에 어떻게 대답 할 지 모르겠습니다. 그는 이미 자신의 방법을 '수학'(http://jsfiddle.net/QnUsf/에서 작동)에 추가했으며, 괜찮 냐고 묻습니다. – Matt

+0

@Matt가 업데이트되었습니다. OPs fn과 fn은 실제로 같지 않습니다 ... – Neal

+1

당신 말이 맞습니다; IE에서 작동하지 않을 것이다. IE에서는 비표준'__proto__'를 지원하지 않는다. – Matt

관련 문제