2010-06-24 15 views
8

¿Cómo puedo especificar un getter predeterminado para un prototipo? Con getter predeterminado me refiero a una función que se llama si se llama obj.undefinedProperty123.¿Cómo puedo definir un getter y setter predeterminado usando ECMAScript 5?

Intenté Object.prototype.get = function (property) {..} pero esto no se llama en este caso.

+1

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

+0

Relacionado: [Obtención de JavaScript para todas las propiedades] (http://stackoverflow.com/q/994143/1048572) – Bergi

Respuesta

0

No estoy seguro de lo que está preguntando. Pero si desea que se llame un método cuando el usuario intente acceder al object.nonExistingProperty. No creo que haya ninguna manera de hacer eso.

+0

Eso es exactamente lo que quiero hacer. Creo que es posible y creo recordar que lo hice antes, si supiera cómo ... – Manuel

2

Firefox es posible con no estándar noSuchMethod: -

({__noSuchMethod__:function(){alert(1);}}).a(); 
4

Lo dijo Gareth, excepto que es __noSuchMethod__.

¿O tal vez estabas pensando en PHP?

Aquí hay un artículo muy bueno sobre los getters/setters de propiedades recientemente estandarizados, destacando algunas encarnaciones anteriores no estándar.

http://whereswalden.com/2010/04/16/more-spidermonkey-changes-ancient-esoteric-very-rarely-used-syntax-for-creating-getters-and-setters-is-being-removed/

resumen: no hay 'catch-all' captador/definidor estándar (aún), pero Object.defineProperty es el futuro.

4

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.

Cuestiones relacionadas