Iterieren alle Mitglieder eines Objekts innerhalb einer Funktion des Objekts
-
12-09-2019 - |
Frage
Es wäre sehr nützlich sein, wenn ich dies tun könnte:
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)
}
};
};
Dies ist jedoch nicht scheint zu tun, was ich möchte. Ich stelle fest, dass die Schleife schließlich Schleife haben würde über sie übergeordnete Funktion ist (was auch nicht überraschend, nicht passiert).
Ist dies nicht möglich, weil die ‚this‘ in der zweiten Funktion auf die zweite Funktion bezieht und nicht die erste? Oder ist das Schlüsselwort ‚this‘ nur eine Erklärung Betreiber für ein öffentliches Mitglied und kein Bezug auf das äußere Objekt?
Ich Figur zu bekommen, was ich will auf diese Weise nicht möglich ist, aber gibt es eine andere Art, wie ich über das Erreichen dieses Verhaltens gehen kann?
Lösung
Ich glaube, Sie versuchen, den Wert des Elements zu erhalten und um es der falsche Weg, dies geht so versuchen:
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();
Um zu erklären: die Loopcheck zuerst, wenn die Eigenschaft eine benutzerdefinierte Eigenschaft ist im Gegensatz zu aus dem Objekt-Objekt geerbt werden. Es überprüft auch, dass das Mitglied keine Funktion (wie validate ()) dann alarmiert den Wert des Elements.
Die hasOwnProperty Prüfung wird von Douglas Crockford (Vater von JS) als Best Practice empfohlen, wenn über memebers iterieren.
Hope, das hilft,
Darko
EDIT: Vergessen self
zu erwähnen - ich eingeschlossen, weil es das Standard-Weg, sicherzustellen, dass Ihr das ist eigentlich das, was Sie es sein wollen
Andere Tipps
Wie rufen Sie validate
?
Der folgende Code funktioniert gut für mich:
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();