【问题标题】:Object.defineProperty in for loop [duplicate]for循环中的Object.defineProperty [重复]
【发布时间】:2017-03-03 07:12:40
【问题描述】:

在我的代码中,我有一个对象,

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 的相同值。有没有办法解决这个问题?

【问题讨论】:

  • 不确定收集问题是否正确。可以创建一个stacksn-ps来演示吗?

标签: javascript loops object for-loop defineproperty


【解决方案1】:

我认为问题在于你的循环缺乏封闭性(你可以阅读更多关于这个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);
        }
    })
}

【讨论】:

  • 这就是我想要的工作。
猜你喜欢
  • 2020-10-18
  • 2019-04-09
  • 2014-01-12
  • 1970-01-01
  • 2016-10-04
  • 2016-08-30
  • 1970-01-01
  • 2020-02-07
  • 2014-03-23
相关资源
最近更新 更多