Iterar sobre todos os membros de um objeto dentro de uma função desse objeto
-
12-09-2019 - |
Pergunta
Seria extremamente útil se eu poderia fazer isso:
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)
}
};
};
Este, porém, não parecem para fazer o que eu gostaria. Eu percebo que o loop eventualmente teria de varrer a sua função pai (que também, não surpreendentemente, não acontece).
É este o impossível porque o 'presente' na segunda função refere-se à segunda função e não o primeiro? Ou é a palavra-chave 'this' apenas um operador de declaração para um membro do público e não uma referência para o objeto externo?
Eu acho conseguir o que eu quero desta forma não é possível, mas existe outra maneira I pode ir sobre a realização deste comportamento?
Solução
Eu acho que você está tentando obter o valor do membro e indo pelo caminho errado, então tente o seguinte:
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();
Para explicar: a verificação de loop primeiro, se a propriedade é um usuário propriedade definida em oposição a ser herdado do objeto Object. Ele também verifica que o membro não é uma função (como validate ()) que, em seguida, alerta o valor do membro.
A verificação hasOwnProperty é recomendado por Douglas Crockford (pai de JS) como a melhor prática quando iteração sobre memebers.
Espero que isso ajude,
Darko
EDIT:. Esqueceu-se de self
menção - eu incluído isto porque a sua a forma padrão de garantir que o seu este é realmente o que você quer que ele seja
Outras dicas
Como você está chamando validate
?
O código a seguir funciona bem para mim:
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();