Kuinka iteroida objektin yli, joka käyttää getteria JavaScriptissä
Tässä on objektin määritelmä:
var Vars = new function(){
var that = this;
this.assign = function(name) {
var realValue = undefined;
Object.defineProperty(that, name, {
configurable: true,
get: function() {
//console.log("Get"); do something...
return realValue;
},
set: function(v) {
//console.log("Set"); do something...
realValue = v;
}
});
}
this.destroy = function(name) {
return delete that[name];
}
};
Mutta huomasin, etten voi iteroida tämän objektin yli sillä tavalla kuin haluan.
>> Vars.assign("key")
<- undefined
>> Vars.key = 1
<- 1
>> Vars.key
<- 1
>> for(var i in Vars){console.log(i);}
assign
destroy
<- undefined
Kuinka voisin päästä "avaimeen" kun käyn läpi objektia silmukassa?
Vastaus #1
Sinun täytyy ilmoittaa nimenomaisesti ominaisuuden kuvaajassa, että ominaisuutesi on luetteloitava. Oletusarvo on false. Tämä on syy siihen, miksi et saa sitä, kun käytät for..in. MDN:n mukaan
For...in-lauseke käy läpi objektin luetteloitavat ominaisuudet mielivaltaisessa järjestyksessä. Jokaiselle erilliselle ominaisuudelle voidaan suorittaa lausekkeita.
Koskien luettavaa ominaisuutta, kuten täällä todetaan:
luetteloitava
tosi vain ja ainoastaan, jos tämä ominaisuus ilmenee vastaavan objektin ominaisuuksien luetteloinnin aikana. Oletusarvo on epätosi.
var Vars = new function(){
var that = this;
this.assign = function(name) {
var realValue = undefined;
Object.defineProperty(that, name, {
configurable: true,
// This is the missing line
enumerable: true,
get: function() {
//console.log("Get"); do something...
return realValue;
},
set: function(v) {
//console.log("Set"); do something...
realValue = v;
}
});
}
this.destroy = function(name) {
return delete that.Local[name];
}
};
Vars.assign("key");
for(var i in Vars){console.log(i);}