Come sapete, possiamo definire getter e setter in JS utilizzando defineProperty()
. Sono stato bloccato mentre cercavo di estendere la mia lezione usando defineProperty()
.JS defineProperty and prototype
Ecco un codice di esempio:
Ho un array di campi che deve essere aggiunto a un oggetto
fields = ["id", "name", "last_login"]
Inoltre ho una classe che verrà modificato
var User = (function(){
// constructor
function User(id, name){
this.id = id
this.name = name
}
return User;
})();
E una funzione che aggiungerà campi alla classe usando 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
}
})
})
};
Dopo l'esecuzione define_fields()
ho i miei campi nel caso del User
define_fields(fields);
user1 = new User(1, "Thomas")
user2 = new User(2, "John")
Ma i valori di queste proprietà sono identiche
console.log(user2.id, user2.name) // 2, John
console.log(user1.id, user1.name) // 2, John
C'è un modo per rendere il lavoro correttamente defineProperty()
in questo caso? Se capisco il problema è con value
che diventa identico per ogni istanza della classe, ma non riesco a capire come risolverlo. Grazie in anticipo per le vostre risposte.
UPD: In questo modo getta "RangeError: Dimensione massima stack di chiamate superato"
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
}
})
})
};
Gotta love JavaScript. Un momento pensi di avere il peso di tutte le cose che puoi esprimere con esso, e poi ti dimostra orribilmente torto orribile. – Dmitry
Devi avere paura di js in produzione. Non accetterò mai un lavoro per risolvere un'applicazione js che non ho scritto! – NoChance