Проблема
Недавно я написал программу на JavaScript, в которой используется геттеры и сеттеры. Я прочитал документацию MDN по обоим методам, но запутался, пытаясь их использовать.
Вкратце, я просто хочу создать серию похожих свойств, которые будут иметь одинаковые геттеры и сеттеры, но я не хочу переписывать каждый отдельный сеттер и получатель strong > для каждой собственности.
Выполнение
Как было сказано выше, я попытался выполнить следующий код:
var defaultProperty = {
set: function(val) {
this.value = val - 1; // Just an example
},
get: function() {
return this.value + 1; // Just an example
}
};
var myObj = {};
Object.defineProperties(myObj, {
foo: defaultProperty,
bar: defaultProperty
});
Затем я присвоил своим свойствам foo
и bar
новые значения, например:
myObj.foo = 3;
myObj.bar = 7;
И, наконец, я ожидал чего-то вроде этого:
console.log(myObj.foo, myObj.bar);
> 3 7
Но вместо этого я неожиданно получил следующее:
> 7 7
Похоже, что два свойства либо ссылаются на один и тот же адрес памяти, либо используют одни и те же сеттеры / геттеры. Заметив это, я попытался решить проблему и создал каждое свойство отдельно, например:
Object.defineProperties(myObj, {
foo: {
set: function(val) {
this.value = val - 1;
},
get: function() {
return this.value + 1;
}
},
bar: {
set: function(val) {
this.value = val - 1;
},
get: function() {
return this.value + 1;
}
}
});
Но результат был тот же:
myObj.foo = 3;
myObj.bar = 7;
console.log(myObj.foo, myObj.bar);
> 7 7
Я также пробовал использовать функции __defineSetter__
и __defineGetter__
, но результат не изменился.
Мои вопросы
Теперь, после нескольких неудачных попыток решить мои проблемы, мне интересно:
- Можно ли определить одни и те же сеттеры и геттеры для разных свойств объекта?
- Если да, то что я делаю не так и почему мои свойства ведут себя так, как будто это одно и то же свойство?
- Есть ли лучший способ выполнить то, что я пытаюсь сделать (возможно, без написания каждого сеттера и получателя для каждого свойства)?
bind
, если бы вы его не удалили: - / 24.02.2015value
кthis
, что и приводило к неожиданному результату. Объемthis
не изменился. Использование вашей функции генератора нарушает область видимости, создавая отдельные ссылки дляvalue
. 24.02.2015