2012-06-16 5 views
5

Domanda abbastanza semplice ma Google non ha ancora trovato nulla.Come posso clonare/copiare un'istanza di un oggetto in CoffeeScript?

Come copiare/clonare/duplicare un'istanza di un oggetto in Coffeescript? Potrei sempre creare un metodo clone() che restituisca una nuova istanza con valori copiati, ma sembra un modo incline agli errori.

Does CoffeeScript offre una soluzione più semplice?

risposta

8

Questo potrebbe funzionare.

clone = (obj) -> 
    return obj if obj is null or typeof (obj) isnt "object" 
    temp = new obj.constructor() 
    for key of obj 
    temp[key] = clone(obj[key]) 
    temp 

applicati dal: What is the most efficient way to deep clone an object in JavaScript?

+0

Dovrebbe essere 'nuova obj.constructor()'. Altrimenti si otterrà un "Impossibile convertire" temp "per oggetto." – dennis

+0

@dennis Grazie dennis. Ho aggiornato il codice. –

5

Grazie a Larry battaglia per il suggerimento:

soluzione di John Resig di utilizzare jQuery.extend funziona brillantemente!

// Shallow copy 
newObject = $.extend({}, oldObject); 

// Deep copy 
newObject = $.extend(true, {}, oldObject); 

Ulteriori informazioni sono disponibili nello jQuery documentation.

+0

Quando si esegue questa operazione, la modifica di una proprietà nel nuovo oggetto termina con la modifica di quella precedente, quindi in che modo si tratta di una "copia"? –

+0

Hmm, che non suona bene :) Stai modificando proprietà primitive o proprietà complesse? Potrebbe essere necessario utilizzare la copia profonda se si modificano le proprietà nidificate. Ecco la risposta originale di John Resig per JavaScript: http://stackoverflow.com/a/122704/746890 (John era il creatore di jQuery). –

+1

Penso di averlo risolto. Penso che sia stato KnockoutJS a confezionare il mio oggetto JS come KO VM. –