Suponha que você tenha um objeto:
var o = {
a: 3
b: 4
}
E você deseja salvar ou fazer algo com ele sempre que uma propriedade deste objeto for alterada. Isso é possível definindo setters especiais em javascript .
Observe primeiro que significa que precisaremos de dois objetos: um para realmente armazenar os dados, um para conter os getters especiais. (Existe uma maneira elegante de evitar isso?)
No entanto, o irritante é que – se você ler a página API acima, os configuradores devem ser configurados manualmente. Felizmente, Object.defineProperty
isso nos ajudará a redefinir um número ilimitado de configuradores da seguinte forma:
var create_custom_setter = function(destination, source, custom_setter){
destination = destination || {};
for(var prop in source){
if(typeof(source[prop]) === "object"){
var sub_destination = create_custom_setter({}, source[prop]);
destination[prop] = sub_destination;
}else{
// javascript scope problem:
var maker_set = function(source, prop){
return function(value) {
source[prop] = value;
custom_setter(value, prop, destination, custom_setter);
}
}
// default setter:
var maker_get = function(source, prop){
return function(){
return source[prop];
}
}
Object.defineProperty(destination, prop, {
set: maker_set(source, prop),
get: maker_set(source, prop)
});
}
}
return destination;
}
Posso criar um objeto frontal o
como este com um configurador global personalizado:
var front_facing = create_custom_setter({}, o, function(value, prop){
console.log(prop + " has been set");
})