2013-06-02 10 views
16

Ho un oggetto, che viene passato in molte funzioni diverse all'interno di una funzione. queste funzioni possono o non possono modificare il valore dell'oggetto, ma se lo cambiano, vorrei ricevere le ultime modifiche sull'oggetto.javascript pass oggetto come riferimento

segue è quello che im cercando di fare:

var ob = {text: 'this is me', name: 'john'} 

function (object) { 

    changeObject(object); 
    customObjectChanger(object); 
    callback = function (object) { 
      object.text = 'new text'; 
    } 

    callback(object); 

    // object value here should be object{text: 'new text', name: 'john'};  
} 
+2

Javascript passa automaticamente gli oggetti per riferimento tutto il tempo. Hai provato il tuo codice sopra per vedere se fa già quello che vuoi? – jcsanyi

+0

no, non ho. l'ho letto volevo solo confermare qui – Basit

+2

JavaScript non * * * [Passaggio per riferimento] (http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference). Tuttavia, JavaScript * non esegue copie di oggetti quando vengono passati o assegnati *. In quanto tale, è lo * stesso * oggetto con un nome diverso - le modifiche apportate all'oggetto (da qualsiasi nome) influenzano detto oggetto. – user2246674

risposta

79

In oggetti JavaScript sono sempre passati per copia di riferimento. Non sono sicuro se questa sia la terminologia esatta corretta, ma verrà passata una copia del riferimento all'oggetto.

Ciò significa che qualsiasi modifica apportata all'oggetto sarà visibile all'utente dopo che la funzione è stata eseguita. .

Codice:

var obj = { 
 
    a: "hello" 
 
}; 
 

 
function modify(o) { 
 
    o.a += " world"; 
 
} 
 

 
modify(obj); 
 
console.log(obj.a); //prints "hello world"


Detto questo, dal momento che è solo una copia di il riferimento che è passato in, se si riassegnare l'oggetto all'interno della tua funzione, questo sarà non essere visibile al di fuori della funzione poiché era solo uno copia di il riferimento che hai modificato.

Codice:

var obj = { 
 
    a: "hello" 
 
}; 
 

 
function modify(o) { 
 
    o = { 
 
    a: "hello world" 
 
    }; 
 
} 
 

 
modify(obj); 
 
console.log(obj.a); //prints just "hello"

+0

http: // en.wikipedia.org/wiki/Evaluation_strategy - Preferisco "Call By [Object] Sharing" per la sua immediatezza, separazione dei problemi di implementazione e riduzione dell'ambiguità con altre convenzioni di chiamata. ECMAScript * non * usa "Riferimento" per questo scopo in qualsiasi parte della specifica. (Il tipo di specifica di riferimento non si applica alle chiamate di funzione.) – user2246674

+2

+1 per una chiara descrizione di ciò che è diverso da un riferimento pass-by tradizionale. – jcsanyi

+0

@user - interessante - grazie per le informazioni. Uno di questi giorni mi occuperò di leggere le specifiche :) –

3

"oggetti" non sono valori in JavaScript, e non può essere "superato".

Tutti i valori con cui si ha a che fare sono riferimenti (puntatori agli oggetti).

Passare o assegnare un riferimento fornisce un altro riferimento che punta allo stesso oggetto. Ovviamente è possibile modificare lo stesso oggetto attraverso quell'altro riferimento.

+1

Infatti - così una copia del riferimento all'oggetto è ... "passata" -_- –

+0

Infatti l'oggetto non sarà passato, ma un riferimento lo sarà, e potrai modificarne le proprietà se lo modifichi all'interno del ricevitore funzione – Ignacio