Iterare su tutti i membri di un oggetto all'interno di una funzione di quell'oggetto
-
12-09-2019 - |
Domanda
Sarebbe estremamente utile se avrei potuto fare questo:
var MyObject = function(param1, param2, ... paramN)
{
this.var1 = stuff;
this.var2 = moreStuff;
.
.
.
this.varN = nStuff;
this.validate = function()
{
for(var current in this)
{
alert(current);
//validate all member variables (even this function I suppose)
}
};
};
Questo però non sembrare per fare quello che vorrebbe. Mi rendo conto che il ciclo sarebbe poi dovuto ad anello su di esso la funzione di genitore (che anche, non a caso, non accade).
E 'questo l'impossibile perché 'questo' nella seconda funzione si riferisce alla seconda funzione e non il primo? O è la parola chiave 'questo' solo un operatore di dichiarazione per un membro del pubblico e non un riferimento all'oggetto esterno?
I figura ottenere quello che voglio in questo modo non è possibile, ma c'è un altro modo posso andare circa il raggiungimento di questo comportamento?
Soluzione
Credo che si sta cercando di ottenere il valore del membro e andando su di esso nel modo sbagliato in modo da provare in questo modo:
var MyObject = function() {
this.var1 = 'var 1 value';
this.var2 = 'var 2 value';
this.varN = 'var n value';
var self = this;
this.validate = function() {
for (var member in self) {
if (!self.hasOwnProperty(member) || typeof(self[member]) === "function") continue;
alert(self[member]);
}
};
};
var m = new MyObject();
m.validate();
Per spiegare: il controllo del ciclo prima se la proprietà è una proprietà definita dall'utente invece di essere ereditata dall'oggetto oggetto. Verifica inoltre che il membro non è una funzione (come validate ()) poi avverte il valore del membro.
Il controllo hasOwnProperty è consigliato da Douglas Crockford (padre di JS) come la migliore procedura l'iterazione di memebers.
Spero che questo aiuti,
Darko
EDIT: dimenticato di dire self
- ho inserito questo perché è il modo standard di fare in modo che la vostra questo è in realtà ciò che si vuole che sia
Altri suggerimenti
Come stai chiamando validate
?
Il seguente codice funziona bene per me:
var MyObject = function(){
this.var1 = 'stuff';
this.var2 = 'moreStuff';
this.varN = 'Stuff';
this.validate = function()
{
for(var current in this)
{
alert(current);
}
};
};
var m = new MyObject();
m.validate();