2013-07-26 11 views
6

Ho bisogno di un metodo in oggetto Math di javascript che calcoli il logaritmo di qualsiasi base. Quindi, in pratica quello che ho fatto è stato questo:Come posso aggiungere il metodo a Math in javascript

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

Qual è il lato negativo di estendere la funzione built-in come questo?

Per rendere più chiara la mia situazione, sto prendendo l'input dell'utente e lo sostituisco con i nomi delle funzioni degli oggetti Math appropriati e lo passiamo a eval per il calcolo. Se questo non è chiaro, il mio dilemma è, nel mio caso, che devo usare eval (anche se è malvagio) e estendere la funzione dell'oggetto Math più adatta al mio caso.

C'è possibilità di alcuni bug strani o altro quando estendo la funzione built-in in questo modo o sono le cose perfettamente normali da fare?

+0

non esiste un costruttore Math() quindi non è possibile prototiparlo, le funzioni matematiche sono solo funzioni, non metodi di un oggetto. – defaultNINJA

+0

Sì, non può essere prototipato. –

+0

@Jack_of_All_Trades sì, può essere prototipato. Vedi la mia risposta. – Neal

risposta

6

Non modificare ciò che non si possiede.

  • Cosa succede se un altro plug-in o codice di terze parti di usare aggiunge la propria versione di log_b-Math, che fornisce una firma completamente diverso?

  • Cosa succede se una versione futura di JavaScript definisce la propria versione di log_b su Math?

Qualcuno sta per piangere, perché per qualcuno è solito fare ciò che si aspettano che.


Io non so perché si estende Mathmeglio si adatta il vostro caso.

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

... sembra ancora adatto al tuo caso. Ancora meglio, definisci il tuo spazio dei nomi e inseriscilo lì;

var ME = {}; 

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

+1 per i puntatori – exexzian

+0

Grazie per la risposta chiara Matt. Davvero utile per me! –

0

È possibile prototipi che:

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

Ma non è probabilmente la migliore idea in quel codice del browser si potrebbe essere sovrascrittura.

Meglio aggiungere questo metodo a un oggetto creato dall'utente.

+0

Non sono sicuro di come questo risponda alla domanda? Ha già aggiunto il proprio metodo a 'Math' (che funziona http://jsfiddle.net/QnUsf/), sta chiedendo se è OK, no? – Matt

+0

@Matt aggiornato. Le OP fn e my fn non sono proprio le stesse ... – Neal

+1

Hai ragione; il tuo non funzionerà in IE, che non supporta il '__proto__' non standard, dove come sua volontà: P. – Matt

Problemi correlati