Как сделать динамический геттер с defineProperty в JavaScript?

Я хочу определить динамические функции получения с defineProperty в JavaScript, как показано ниже. Чтобы сделать функцию только для чтения, я хочу использовать defineProperty, Это позволяет мне генерировать исключение в функции установки.

Однако функция получения не будет работать. Я думал, что этот геттер возвращает любые свойства obj динамически. Но это не так. Всегда возвращается obj["three"], последняя собственность. Есть ли методы для создания динамического геттера, который возвращает соответствующее свойство в 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
    });
}

1 ответ

Решение

Как уже упоминалось @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);
}
Другие вопросы по тегам