Выполните итерацию по всем элементам объекта в функции этого объекта

StackOverflow https://stackoverflow.com/questions/1115269

  •  12-09-2019
  •  | 
  •  

Вопрос

Было бы чрезвычайно удобно, если бы я мог это сделать:

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)
        }
    };
};

Это, однако, не казаться делать то, что я бы хотел.Я понимаю, что циклу в конечном итоге пришлось бы зацикливаться на своей родительской функции (чего также, что неудивительно, не происходит).

Неужели это невозможно, потому что "это" во второй функции относится ко второй функции, а не к первой?Или ключевое слово 'this' является только оператором объявления для открытого члена, а не ссылкой на внешний объект ?

Я полагаю, что получить то, что я хочу таким образом, невозможно, но есть ли другой способ, которым я могу добиться такого поведения?

Это было полезно?

Решение

Я думаю, что вы пытаетесь получить ценность участника и делаете это неправильным путем, так что попробуйте это:

      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();

Чтобы объяснить:цикл сначала проверяет, является ли свойство свойством, определяемым пользователем, в отличие от наследования от объекта Object.Он также проверяет, что элемент не является функцией (например, validate()), затем он предупреждает о значении элемента.

Проверка hasownproperty рекомендована Дугласом Крокфордом (отцом JS) в качестве наилучшей практики при переборе элементов.

Надеюсь, это поможет,

Дарко

Редактировать:Забыл упомянуть self - я включил это, потому что это стандартный способ убедиться, что ваше это действительно то, чем вы хотите, чтобы это было.

Другие советы

Как ты звонишь validate?

Следующий код отлично работает для меня:

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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top