2010-06-24 19 views
8

Wie kann ich einen Standard-Getter für einen Prototyp angeben? Mit Standard-Getter meine ich eine Funktion, die aufgerufen wird, wenn obj.undefinedProperty123 aufgerufen wird.Wie kann ich einen Standard-Getter und Setter mit ECMAScript 5 definieren?

Ich habe versucht, Object.prototype.get = function (property) {..}, aber das wird in diesem Fall nicht aufgerufen.

+1

Ich glaube nicht, dass es eine Möglichkeit gibt, dies auch mit nicht-standardmäßigen Implementierungen zu tun, und schon gar nicht mit ECMAScript 5. Es gibt eine nicht-standardisierte Implementierung namens '__noSuchMethod__' für Methoden in Firefox, und vielleicht kommt sie auch Chrome, aber nichts Ähnliches für Nicht-Funktionseigenschaften. Die einzige Route scheint eine Wrapper-Funktion wie "get" zu verwenden, über die auf alle Eigenschaften zugegriffen wird. – Anurag

+0

Related: [JavaScript Getter für alle Eigenschaften] (http://stackoverflow.com/q/994143/1048572) – Bergi

Antwort

0

Ich bin nicht sicher über das, was Sie fragen. Wenn Sie möchten, dass eine Methode aufgerufen wird, wenn der Benutzer versucht, auf object.nonExistingProperty zuzugreifen. Ich denke nicht, dass es irgendeinen Weg gibt, das zu tun.

+0

Das ist genau das, was ich tun möchte. Ich denke, es ist möglich und ich denke, ich erinnere mich, dass ich das schon einmal gemacht habe - wenn ich nur wüsste wie ... – Manuel

2

Firefox ist es möglich, mit Nicht-Standard-noSuchMethod: -

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

Was Gareth sagte, es sei denn es __noSuchMethod__ ist.

Oder haben Sie vielleicht an PHP gedacht?

Hier ist ein sehr guter Artikel über die kürzlich standardisierten Eigenschaft Getter/Setter, Hervorhebung einiger früheren nicht-Standard-Inkarnationen.

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

Zusammenfassung: Es gibt keinen Standard 'catch-all' Getter/Setter (noch) nicht, aber Object.defineProperty ist die Zukunft.

4

In ECMAScript 5 können Sie nur auf bestimmte benannte Eigenschaften get/set-Operationen abfangen (nicht allgemein alle Eigenschaften) über Object.defineProperty:

Object.definedProperty(someObj, "someProp", { 
    get: function() { 
     console.log("you tried to get someObj.someProp"); 
     return "foo"; 
    } 
}); 

Hier wird die get Funktion jederzeit Code ausführen versucht someObj.someProp zu lesen .

Im kommenden ECMAScript 6-Entwurf wird dies über proxies möglich sein. Ein Proxy hat ein zugrunde liegendes Zielobjekt und setzt/erhält Funktionen. Jedes Mal, wenn eine Set- oder Get-Operation für eine der Eigenschaften eines Proxys ausgeführt wird, wird die entsprechende Funktion ausgeführt, wobei das Zielobjekt des Proxys, der verwendete Eigenschaftsname und der in einem set-Versuch verwendete Wert als Argumente verwendet werden.

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); 

Hier Einstellung zu bekommen Eigenschaftswerte auf prox bewirkt, dass die set/get Funktionen auszuführen.