ご存じのように、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
}
})
})
};