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?

Foi útil?

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top