2015-07-19 11 views
10

Sto tentando di prendere in giro la funzione times dalla libreria JavaScript Underscore.js.Utilizzo di una variabile come oggetto e una funzione

Questa funzione accetta due sintassi:

_.times(3, function(n) { 
    console.log("hello " + n); 
}); 

e

_(3).times(function(n) { 
    console.log("hello " + n); 
}); 

Finora sono riuscito a prendere in giro il primo con la creazione di un oggetto _ come questo:

var _ = { 
    times: function(reps, iteratee) { 
     // a loop 
    } 
}; 

E la seconda sintassi creando una funzione _ che restituisce un oggetto:

function _(n) { 
    return { 
     times: function(iteratee) { 
      // a loop 
     } 
    }; 
} 

Ma non posso utilizzare questi 2 metodi insieme. Devo trovare un modo che consenta entrambe le sintassi. Hai idea di come utilizzare il carattere _ come oggetto e anche una funzione?

risposta

3

funzioni sono oggetti in Javascript, quindi si può solo fare qualcosa di simile:

var _ = function(a,b) { /* ... */ }; 
_.times = _; 
+1

C'è molto di più di questo per far funzionare '_ (3) .times (fn). Devi restituire un oggetto dalla funzione che cattura il '3' nei dati di istanza e l'oggetto ha il metodo' .times() '. – jfriend00

+0

@ jfriend00 Sei corretto, ma non deve fare alcun lavoro se OP sta solo cercando di deriderlo, giusto? –

+0

L'OP vuole qualcosa che funzioni. Penso che il loro termine "mock" qui significhi che vogliono *** copiare *** il modo in cui '.times()' funziona. – jfriend00

0

Si potrebbe misura la funzione dopo aver definito essa. Prova questo:

function _(n) { 
 
    return { 
 
    times: function(iteratee) { 
 
     while (n-- > 0) 
 
     iteratee(); 
 
    } 
 
    }; 
 
} 
 

 
_.times = function(reps, iteratee) { 
 
    while (reps-- > 0) 
 
    iteratee(); 
 
}; 
 

 
function iter() { 
 
    console.log('iter!'); 
 
} 
 

 
_(3).times(iter); 
 

 
console.log('----'); 
 

 
_.times(5, iter);

5

Si dovrebbe essere in grado di combinare due sintassi simile a questo:

var _ = (function() { 

    var times = function(n, iteratee) { 
     // a loop 
    }; 

    function _(n) { 
     return {times: function(iteratee) { 
      return times(n, iteratee); 
     }}; // or shorter: {times: times.bind(null, n)} 
    } 

    _.times = times; 

    return _; 
})(); 

Qui beneficiare del fatto che le funzioni sono anche oggetti e quindi può avere proprietà .

+0

Questo è perfetto se aggiungi qualcosa come if (arguments.length> 1) {volte (n, argomenti [1]); } prima del ritorno all'interno della funzione _ (n) ... –

Problemi correlati