Object.defineProperty 在 for 循环中
Object.defineProperty in for loop
在我的代码中有一个对象,
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 的相同值。有没有可能解决这个问题?
我认为问题在于您的循环中缺少闭包(您可以阅读更多相关内容 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);
}
})
}
在我的代码中有一个对象,
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 的相同值。有没有可能解决这个问题?
我认为问题在于您的循环中缺少闭包(您可以阅读更多相关内容 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);
}
})
}