如您所知,我们可以在 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
}
})
})
};