2011-01-07 14 views
5


Mam następujący kod -javascript nieskończonej pętli z defineSetter

var obj = { 
    name : "Yosy" 
}; 

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

Problem polega na tym -
Jeśli zmienię obj.name do czegoś innego i console.log (obj) będę się niezdefiniowany na własności nazwy. Więc próbowałem naprawić obiekt. defineSetter do tego -

var obj = { 
    name : "Yosy" 
}; 

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

Jeśli nazwa zmieni się na „ABC” lub coś innego dostaniesz nieskończoną pętlę ponieważ w defineSetter ja ustawiania wartości nieruchomości „Nazwa”.
co robić?

Odpowiedz

8

Cóż, jeśli chcesz, aby móc skorzystać z właściwości name jak normalne i nadal ostrzega wartość jak dobrze, należy wymienić swój obiekt pola inaczej, tak:

var obj = { 
    _name : "Yosy" 
}; 

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

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

albo coś takiego:

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

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

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

, aby uniemożliwić strzelcy ponowne wystrzelenie po ustawieniu właściwości.

EDIT:

Dla wszystkich zainteresowanych, oto niektóre dokumentacja: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Objects#Defining_Getters_and_Setters

+0

+1, wystarczy dodać inny zasób http://ejohn.org/blog/javascript-getters-and-setters/ – Biswanath

+0

I nie wiedziałem o całej konwencji podkreślenia przed nazwą zmiennej ... Naprawiono problem z nieskończoną pętlą, dzięki! – Panda4Man

Powiązane problemy