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