Как вы знаете, мы можем определить геттеры и сеттеры в JS, используя defineProperty()
. Я пытаюсь расширить класс, используя defineProperty()
.
Вот пример кода:
У меня есть массив полей, которые нужно добавить к объекту
fields = ["id", "name", "last_login"]
Также у меня есть класс, который будет изменен
var User = (function(){
// constructor
function User(id, name){
this.id = id
this.name = name
}
return User;
})();
И функция, которая добавит поля в класс с помощью defineProperty()
var define_fields = function (fields){
fields.forEach(function(field_name){
var value = null
Object.defineProperty(User.prototype, field_name, {
get: function(){ return value }
set: function(new_value){
/* some business logic goes here */
value = new_value
}
})
})
};
После запуска define_fields()
у меня есть мои поля в экземпляре User
define_fields(fields);
user1 = new User(1, "Thomas")
user2 = new User(2, "John")
Но значения этих свойств идентичны
console.log(user2.id, user2.name) // 2, John
console.log(user1.id, user1.name) // 2, John
Есть ли способ сделать defineProperty()
корректно работать в этом случае?
Если я понимаю, что проблема связана с value
, которая становится идентичной для
каждый экземпляр класса, но я не могу понять, как его исправить. заранее спасибо
для ваших ответов.
UPD: Таким образом, "RangeError: превышен максимальный размер стека вызовов"
var define_fields = function (fields){
fields.forEach(function(field_name){
Object.defineProperty(User.prototype, field_name, {
get: function(){ return this[field_name] }
set: function(new_value){
/* some business logic goes here */
this[field_name] = new_value
}
})
})
};