2011-01-07 26 views
5


Tengo el siguiente código -Javascript bucle infinito con defineSetter

var obj = { 
    name : "Yosy" 
}; 

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

El problema es -
si cambio obj.name a otra cosa y console.log (obj) voy a entrar indefinido en la propiedad del nombre. Así que traté de arreglar obj. defineSetter a esto -

var obj = { 
    name : "Yosy" 
}; 

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

Si el cambio de nombre a "ABC" o algo más obtendrá un bucle infinito porque en el defineSetter estoy fijando el valor de la propiedad "nombre".
¿qué hacer?

Respuesta

8

Bueno, si usted quiere ser capaz de utilizar la propiedad name como normal y todavía alertar al valor, así, usted debe nombrar a su campo de objeto diferente, como esto:

var obj = { 
    _name : "Yosy" 
}; 

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

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

o menos así:

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

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

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

para evitar que el armador vuelva a disparar cuando configura la propiedad.

EDIT:

Para todos los interesados, aquí hay algo de documentación: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Objects#Defining_Getters_and_Setters

+0

1, sólo para añadir otro recurso que http://ejohn.org/blog/javascript-getters-and-setters/ – Biswanath

+0

no sabía acerca de todo el guión bajo antes de la convención del nombre variable ... sin embargo, solucionó mi problema de bucle infinito, ¡gracias! – Panda4Man