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