2010-06-24 8 views
8

Come posso specificare un getter predefinito per un prototipo? Con getter predefinito intendo una funzione che viene chiamata se si chiama obj.undefinedProperty123.Come posso definire un getter e un setter predefiniti usando ECMAScript 5?

Ho provato Object.prototype.get = function (proprietà) {..} ma questo non viene chiamato in questo caso.

+1

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

+0

Correlati: [JavaScript getter per tutte le proprietà] (http://stackoverflow.com/q/994143/1048572) – Bergi

risposta

0

Non sono sicuro di cosa stai chiedendo. Ma se si desidera chiamare un metodo quando l'utente tenta di accedere a object.nonExistingProperty. Non penso che ci sia un modo per farlo.

+0

Questo è proprio quello che voglio fare. Penso che sia possibile e penso di ricordare che l'ho fatto prima - se solo sapessi come ... – Manuel

2

Firefox è possibile con non standard noSuchMethod: -

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

Che Gareth ha detto, tranne che è __noSuchMethod__.

O forse stavi pensando a PHP?

Ecco un ottimo articolo sui getter/setter di proprietà recentemente standardizzati, evidenziando alcune precedenti incarnazioni non standard.

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

sintesi: non c'è alcuna norma 'catch-all' getter/setter (ancora), ma Object.defineProperty è il futuro.

4

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.