2013-07-26 14 views
6

Potrzebuję metody w obiekcie Math javascript, która oblicza logarytm dowolnej podstawy. Więc w zasadzie to, co zrobiłem, było to:Jak dodać metodę do Math w javascript

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

Co jest minusem rozszerzenia wbudowanej funkcji w taki sposób?

Aby moja sytuacja była bardziej przejrzysta, biorę dane wprowadzane przez użytkownika i zastępuję je odpowiednimi nazwami funkcji obiektów matematycznych i przekazuję je do eval do obliczeń. Jeśli to nie jest jasne, moim dylematem jest, w moim przypadku, użycie ewaluacji (nawet jeśli jest to zło), a rozszerzenie funkcji obiektu matematycznego najlepiej pasuje do mojej sprawy.

Czy istnieje możliwość pojawienia się dziwnych błędów lub innych rozszerzeń funkcji wbudowanej w taki sposób lub czy jest to całkowicie normalne działanie?

+0

nie ma konstruktora Math(), więc nie można go prototypować, funkcje matematyczne są tylko funkcjami, a nie metodami obiektu. – defaultNINJA

+0

Tak, nie można go prototypować. –

+0

@Jack_of_All_Trades tak, można go prototypować. Zobacz moją odpowiedź. – Neal

Odpowiedz

6

Nie należy modyfikować tego, co nie należy do użytkownika.

  • Co się stanie, jeśli inny plugin lub 3 kod partia użyć dodaje własną wersję log_b do Math, która zapewnia zupełnie inny podpis?

  • Co się stanie, jeśli przyszła wersja JavaScriptu zdefiniuje własną wersję log_b na Math?

ktoś będzie płakać, bo kogoś to przyzwyczajenie zrobić to, czego oczekują go.


Nie jestem pewien, dlaczego rozszerzenie Mathnajlepsze garnitury twoim przypadku.

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

... nadal wydaje się pasować do twojej sprawy. Nawet lepiej, zdefiniuj własną przestrzeń nazw i umieść ją tam;

var ME = {}; 

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

+1 dla wskaźników – exexzian

+0

Dzięki za jasną odpowiedź Matt. Naprawdę mi pomocna! –

0

Można go prototype:

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

Ale to nie jest chyba najlepszy pomysł w tym ty mógłby być nadpisując kodzie przeglądarki.

Lepiej dodać tę metodę do obiektu, który sam wykonałeś.

+0

Nie jestem pewien, jak to odpowiada na pytanie? Dodał już swoją własną metodę do 'Math' (która działa http://jsfiddle.net/QnUsf/), pyta, czy jest OK, nie? – Matt

+0

@Matt zaktualizowany. OPs fn i mój fn nie są tak naprawdę ... – Neal

+1

Masz rację; twój nie będzie działał w IE, co nie obsługuje niestandardowego '__proto__', gdzie jako jego wola: P. – Matt

Powiązane problemy