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.
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
Related: [JavaScript Getter für alle Eigenschaften] (http://stackoverflow.com/q/994143/1048572) – Bergi