2017-03-03 73 views
1

在我的代码我有一个对象,Object.defineProperty在for循环

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

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

而且我想定义这样的一些属性:

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

它正常工作对我来说,但它的只有一段代码。我想,这将是更好的,使我的代码更短,我决定来而不仅仅是复制和重命名它使用一个for循环这样的:

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

,但它只是一个问题。我得到了最后一个inf的所有项目的相同值。有没有可能解决这个问题?

+0

并非一定正确地收集问题。你可以创建一个stacksnippets来演示吗? – guest271314

回答

0

我认为问题在于你的循环中没有闭合(你可以阅读更多关于here)。最简单的办法是定义与let你的循环变量,它创建块范围变量:

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

这就是我想要的。 – Kosiarznerek