Выполните итерацию по всем элементам объекта в функции этого объекта
-
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();