1

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

但是,getter 函数将不起作用。我认为这个 getter 会obj动态返回任何属性。但事实并非如此。它总是返回obj["three"], last 属性。是否有任何方法可以制作在 JavaScript 中返回适当属性的动态 getter?

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

1 回答 1

2

正如@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);
}
于 2013-12-22T14:41:38.780 回答