Как сделать динамический геттер с 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);
}