En ECMAScript 5, sólo se puede interceptar obtener/operaciones con el conjunto de propiedades con nombre específicos (no universalmente todas las propiedades) a través de Object.defineProperty
:
Object.definedProperty(someObj, "someProp", {
get: function() {
console.log("you tried to get someObj.someProp");
return "foo";
}
});
Aquí, la función get
se ejecutará cualquier código de tiempo intenta leer someObj.someProp
.
En el próximo borrador de ECMAScript 6, esto será posible a través del proxies. Un proxy tiene un objeto objetivo subyacente y funciones set/get. Cada vez que ocurre una operación de establecer u obtener en cualquiera de las propiedades de un proxy, se ejecuta la función apropiada, tomando como argumentos el objeto de destino del proxy, el nombre de propiedad utilizado y el valor utilizado en un intento de 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);
Aquí, el establecimiento de conseguir valores de las propiedades en prox
hará que los set
/get
funciones a ejecutar.
No creo que haya una manera de hacerlo, incluso con una implementación no estándar, y ciertamente no con ECMAScript 5. Hay una implementación no estándar llamada '__noSuchMethod__' para los métodos en Firefox, y puede aparecer Chrome, pero nada similar para propiedades sin función. La única ruta parece usar una función de envoltura como 'get' a través de la cual se accede a todas las propiedades. – Anurag
Relacionado: [Obtención de JavaScript para todas las propiedades] (http://stackoverflow.com/q/994143/1048572) – Bergi