Javascript, redefina um número ilimitado de setters com a mesma função

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.definePropertyisso 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 ocomo este com um configurador global personalizado:

var front_facing = create_custom_setter({}, o, function(value, prop){ 
console
.log(prop + " has been set");
})