2013-05-02 18 views
22

Ho un modello che "porterà" (Model.validator) un'istanza di validatore con esso, e ho bisogno che il validatore abbia accesso agli attributi del modello. Quindi, quello che ho trovato è il seguenteIl riferimento circolare tra gli oggetti è una cattiva pratica?

var Validator = function(model) { 
    this.model = model; 
}; 

var Model = function() { 
    this._attributes = {}; 
    this.validator = new Validator(this); 
}; 

var model = new Model(); 

Questo codice crea un riferimento circolare tra questi 2 oggetti. È una cattiva pratica che causerà perdite di memoria? Qualche altra idea su come implementarla?

P.S. Ho visto riferimenti circolari simili tra oggetti negli ambiti Angular.js.

+6

@ArunPJohny: in IE6 forse ... ma i moderni motori a JS sono perfettamente in grado di gestire i cicli gc. – georg

+3

@ArunPJohny: Nemmeno in IE6, se sono semplici oggetti JS e non includono il DOM – Bergi

+0

Nota che i riferimenti circolari causeranno problemi quando si tratta di serializzazione (tramite 'JSON.stringify()' ad esempio) – Uriel

risposta

19

Questo tipo di codice non causerà perdite di memoria con i browser di oggi; come mentioned on MDN tutti i principali browser sono stati spediti con GC mark-and-sweep (che possono gestire i cicli semplicemente bene) per un po 'di tempo (ad esempio, Firefox stesso ha avuto un collettore di cicli dalla versione 3).

Da un punto di vista architettonico, questo tipo di codice introduce un accoppiamento moderatamente stretto tra i due oggetti (se uno cambia anche in modo minore, l'altro deve essere rivisto per determinare se deve essere modificato) e di conseguenza essere evitato se possibile Ma non c'è nulla di intrinsecamente sbagliato in questo.

+6

"moderatamente stretto accoppiamento "- hai un regalo per understatement. –

+1

@ErickRobertson: Beh, in altri linguaggi c'è anche un'ereditarietà basata sulla classe, 'friend', 'just get the job done dammit' ... almeno qui si può solo andare in giro con l'interfaccia pubblica. :-) – Jon

2

Non ci saranno problemi ne sono sicuro. I parser JS della maggior parte dei browser possono funzionare con dipendenze ciclo durante la raccolta dei dati inutili. Non ci sono più problemi potenziali qui.

2

Non sarà un problema per la garbage collection: qualsiasi nuovo Garbage Collector (> IE6) gestirà i riferimenti circolari bene!

Potrebbe essere un problema se si eseguono funzioni ricorsive o si stampa l'oggetto.

Quindi la risposta è: non è un problema a meno che non si fallisce voi :-)