2011-01-07 32 views
5


Ho il seguente codice -javascript Infinite Loop con defineSetter

var obj = { 
    name : "Yosy" 
}; 

obj.__defineSetter__("name",function(v){ 
    alert(v); 
}); 

Il problema è -
Se obj.name cambiare per qualcos'altro e console.log (obj) mi metterò indefinita sulla proprietà del nome. Quindi ho provato a correggere obj. defineSetter a questo -

var obj = { 
    name : "Yosy" 
}; 

obj.__defineSetter__("name",function(v){ 
    alert(v); 
    this.name = v; 
}); 

Se il cambio di nome in "ABC" o qualcosa d'altro si otterrà un ciclo infinito perché nel defineSetter io pongo il valore del "nome" di proprietà.
cosa fare?

risposta

8

Beh, se si vuole essere in grado di utilizzare la proprietà name come normale ed ancora avvertire il valore così, si dovrebbe assegnare un nome al campo oggetto in modo diverso, in questo modo:

var obj = { 
    _name : "Yosy" 
}; 

obj.__defineSetter__("name",function(v){ 
    alert(v); 
    this._name = v; 
}); 

obj.__defineGetter__("name",function() { 
    return this._name; 
}); 

o qualcosa del genere:

var obj = { 
    fields: { 
     name : "Yosy" 
    } 
}; 

obj.__defineSetter__("name",function(v){ 
    alert(v); 
    this.fields.name = v; 
}); 

obj.__defineGetter__("name",function() { 
    return this.fields.name; 
}); 

per impedire al setter di sparare di nuovo quando si imposta la proprietà.

EDIT:

Per chiunque sia interessato, ecco qualche documentazione: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Objects#Defining_Getters_and_Setters

+0

+1, solo per aggiungere un'altra risorsa http://ejohn.org/blog/javascript-getters-and-setters/ – Biswanath

+0

I non conoscevo l'intero trattino di sottolineatura prima della convenzione del nome della variabile ... ho risolto il mio problema con il loop infinito, grazie! – Panda4Man