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



我想在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);
}

最新更新