In ECMAScript 5, è possibile intercettare solo ricevere/operazioni di set su specifici proprietà denominate (non universalmente tutte le proprietà) tramite Object.defineProperty
:
Object.definedProperty(someObj, "someProp", {
get: function() {
console.log("you tried to get someObj.someProp");
return "foo";
}
});
Qui, la funzione get
verrà eseguito alcun codice di tempo cerca di leggere someObj.someProp
.
Nell'imminente bozza di ECMAScript 6, questo sarà possibile tramite proxies. Un proxy ha un oggetto obiettivo sottostante e imposta/ottieni funzioni. Ogni volta che un'operazione set o get viene eseguita su una delle proprietà di un proxy, viene eseguita la funzione appropriata, prendendo come argomenti l'oggetto di destinazione del proxy, il nome della proprietà utilizzato e il valore utilizzato in un tentativo set
.
var proxyHandler = {
get: function(obj, name){
console.log("you're getting property " + name);
return target[name];
},
set: function(obj, name, value) {
console.log("you're setting property " + name);
target[name] = value;
}
}
var underlyingObj = {};
// use prox instead of underlyingObj to use get/set interceptor functions
var prox = new Proxy(underlyingObj, proxyHandler);
Qui, l'impostazione per ottenere i valori delle proprietà in prox
causerà le set
/get
funzioni per l'esecuzione.
Non credo che ci sia un modo per farlo anche con qualsiasi implementazione non standard, e certamente non con ECMAScript 5. Esiste un'implementazione non standard chiamata '__noSuchMethod__' per i metodi in Firefox, e potrebbe succedere Chrome, ma nulla di simile per le proprietà non funzionali. L'unica route sembra utilizzare una funzione wrapper come 'get' attraverso la quale si accede a tutte le proprietà. – Anurag
Correlati: [JavaScript getter per tutte le proprietà] (http://stackoverflow.com/q/994143/1048572) – Bergi