javascript - for循环中的Object.defineProperty

标签 javascript loops object for-loop defineproperty

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

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

但这只是一个问题。我从最后一个项目中得到的所有项目都具有相同的值。有没有可能解决这个问题?

最佳答案

我认为问题在于循环中缺乏闭包(您可以阅读有关此的更多信息 here )。最简单的解决方案是使用 let 定义循环变量,这会创建 block 作用域变量:

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

关于javascript - for循环中的Object.defineProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42572810/

相关文章:

javascript - 如何通过参数变量更新对象的属性值

javascript - 在jquery中增加行的序列号

JavaScript 仅适用于警报

javascript - Unity实例化对象脚本不重复?

linux - Bash脚本初学者问题: Looping,数组和字符检查

bash - 创建一个充当算命先生或 "magic 8 ball"的 bash 脚本

javascript - 在数组中存储增量值的快捷方式?

python - 从 pandas 中的对象中选择

javascript - 在 jQuery 中将对象传递给 .attr()

javascript - 如何在单击按钮时更改背景图像?