2017-03-03 6 views
1

Dans mon code, j'ai un objet,Object.defineProperty en boucle

var obj = { 
    item1: { 
     coords: { 
      A: new Point(905.76, 1626.67), 
      //... 
     }, 
     inf: { 
      //... 
     } 
    }, 

    item2: { 
     coords: { 
      A: new Point(1259.25, 1634.50), 
      //... 
     }, 
     inf: { 
      //... 
     } 
    }, 
} 

Et je voudrais définir certaines propriétés comme ça:

Object.defineProperty(obj.item1.inf, "corner", { 
    get() { 
     var x = obj.item1.coords.A.x; 
     var y = obj.item1.coords.A.y; 
     return new Point(x, y); 
    } 
}) 
Object.defineProperty(obj.item2.inf, "corner", { 
    get() { 
     var x = obj.item2.coords.A.x; 
     var y = obj.item2.coords.A.y; 
     return new Point(x, y); 
    } 
}) 

Il fonctionne très bien pour moi, mais il est seulement un morceau de code. Je pensais, que ce sera plus agréable de faire mon code plus court et j'ai décidé de lieu de simplement copier et rebaptisèrent utilise une boucle comme ça:

for (item in obj) { 
    Object.defineProperty(obj[item].inf, "corner", { 
     get() { 
      var x = obj[item].coords.A.x; 
      var y = obj[item].coords.A.y; 
      return new Point(x, y); 
     } 
    }) 
} 

Mais juste une question. Je reçois les mêmes valeurs pour tous les éléments inf du dernier. Est-il possible de résoudre ce problème?

+0

Pas certain de recueillir problème correctement. Pouvez-vous créer un Stacksnippets à démontrer? – guest271314

Répondre

0

Je pense que le problème est le manque de fermeture dans votre boucle (vous pouvez en savoir plus sur ce here). La solution la plus simple est de définir votre variable de boucle avec let qui crée variable périmètre de bloc:

for (let item in obj) { 
    Object.defineProperty(obj[item].inf, "corner", { 
     get() { 
      var x = obj[item].coords.A.x; 
      var y = obj[item].coords.A.y; 
      return new Point(x, y); 
     } 
    }) 
} 
+0

Ça marche comme je le voulais. – Kosiarznerek