2013-04-22 38 views
6

ho il seguente codice:Scambia due oggetti in JavaScript

MyObject.prototype.doIt = function() 
{ 
    var a = this.obj1; 
    var b = this.obj2; 
} 

Come posso scambiare i valori di this.obj1 e this.obj2 così obj1 diventa obj2 e obj2 obj1 diventa.

! Nota: ho in mente che non sto lavorando con i tipi primitivi.

risposta

2

è possibile scambiare le proprietà abbastanza facilmente:

MyObject.prototype.doIt = function() 
{ 
    var a = this.obj1; 
    var b = this.obj2; 
    this.obj1 = b; 
    this.obj2 = a; 
} 

Che obj1 e obj2 non sono tipi primitivi è irrilevante. In realtà non c'è bisogno di due variabili:

MyObject.prototype.doIt = function() 
{ 
    var a = this.obj1; 
    this.obj1 = this.obj2; 
    this.obj2 = a; 
} 

Tuttavia, se esistono già al di fuori di questo codice tutti i riferimenti a this.obj1 o this.obj2, non verranno scambiati.

In termini di scambio this.obj1 e this.obj2 ovunque (compresi i riferimenti esistenti), non penso che si possa fare completamente. È possibile rimuovere tutte le proprietà, ad esempio, this.obj1 (salvandole da qualche parte), aggiungere le proprietà da this.obj2 e quindi fare lo stesso per this.obj2. Tuttavia, non sarà possibile scambiare i prototipi, quindi gli oggetti non possono scambiare le identità fondamentalmente.

+0

In effetti, è possibile scambiare il prototipo con l'uso di 'Object.getPrototypeOf()' e 'Object.setPrototypeOf()', ma [MDN] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf) ci avverte fortemente che è una pessima idea per le prestazioni dell'applicazione. –

+0

@ FélixBrunet - Non ci avevo pensato. Immagino sia possibile implementare qualcosa come [Smalltalk's 'become:' method] (https://gbracha.blogspot.com/2009/07/miracle-of-become.html). Freddo! –

4

utilizzare una variabile temporanea per contenere il contenuto di uno degli oggetti, mentre lo scambio:

var tmp = this.obj1; 
this.obj1 = this.obj2; 
this.obj2 = tmp; 
0

Ecco un esempio con oggetti concreti, dicono i tuoi oggetti originali sono 2 div, div1 e div2.

Per scambiare loro,

var temp1 = div1;
var temp2 = div2;

div1 = temp2;
div2 = temp1;

12

È possibile scambiare qualsiasi numero di oggetti o letterali, anche di tipo diverso, utilizzando una funzione identità semplice come questo:

var swap = function (x){return x}; 
b = swap(a, a=b); 
c = swap(a, a=b, b=c); 

Questo funziona in JavaScript perché accetta argomenti aggiuntivi, anche se non sono dichiarati o Usato. Gli incarichi a=b, ecc., Si verificano dopo che a è passato alla funzione.