如何在JavaScript中使用defineProperty制作动态getter?

如何在JavaScript中使用defineProperty制作动态getter?,javascript,dynamic,defineproperty,Javascript,Dynamic,Defineproperty,我想用JavaScript中的defineProperty定义动态getter函数,如下所示。为了生成只读函数,我想使用defineProperty。这使我能够在setter函数中抛出异常 但是,getter函数将不起作用。我认为这个getter动态地返回obj的任意属性。但事实并非如此。它总是返回最后一个属性的obj[“three”]。是否有任何方法可以使动态getter在JavaScript中返回适当的属性 var obj = {"one":1, "two":2, "three":3}; v

我想用JavaScript中的
defineProperty
定义动态getter函数,如下所示。为了生成只读函数,我想使用
defineProperty
。这使我能够在setter函数中抛出异常

但是,getter函数将不起作用。我认为这个getter动态地返回
obj
的任意属性。但事实并非如此。它总是返回最后一个属性的obj[“three”]。是否有任何方法可以使动态getter在JavaScript中返回适当的属性

var obj = {"one":1, "two":2, "three":3};
var cloned = {};

for (var prop in obj) 
{
    var getter = makeGetter(prop);
    Object.defineProperty(cloned, prop, 
    {
        set: function() 
        {
            throw new UnableRewriteException('original cannot be rewrite');
        },
        get: function() 
        {
            return obj[prop]
        },
        enumerable: true
    });
}

正如@paul-s所提到的,循环中的闭包有问题。一个简单的解决方案:

var obj = {"one":1, "two":2, "three":3};
var cloned = {};

function makeReadOnlyProperty(cloned, obj, prop) {
    Object.defineProperty(cloned, prop, 
    {
        set: function() 
        {
            throw new UnableRewriteException('original cannot be rewrite');
        },
        get: function() 
        {
            return obj[prop]
        },
        enumerable: true
    });
}

for (var prop in obj) 
{
    makeReadOnlyProperty(cloned, obj, prop);
}

这看起来又像是经典的循环闭包问题,请记住,
var
将是函数级而不是块级。非常感谢,可能是重复的。我的问题解决了,我可以深入理解JavaScript闭包。:-)