如您所知,我们可以使用defineProperty()
在JS中定义getter和setter。当我尝试使用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
对于类的每个实例都变得相同,但我不知道该如何修复它。提前感谢您的回答。
更新:使用这种方式会抛出“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
}
})
})
};