Il y a une seule chose en ce moment qui peut réellement faire ce que vous voulez, mais, malheureusement, n'est pas largement mis en œuvre:
Il y a seulement deux implémentations disponibles à ce moment, dans le dernier Firefox 4 bêta (il a été autour depuis FF3.7 pré-versions) et dans le nœud de serveur proxy pour JavaScript côté serveur -Chrome et Safari sont actuellement en train de travailler sur lui-.
C'est l'une des premières propositions pour la prochaine version de ECMAScript, c'est une API qui permet de mettre en œuvre virtualisé objets (par procuration), où vous pouvez assigner une variété de pièges -rappels - qui sont exécutés dans des situations différentes, vous prendre le plein contrôle sur ce qu'à ce moment -dans ECMAScript 3/5 - seuls les objets hôte pourrait le faire.
Pour construire un objet proxy, vous devez utiliser l' Proxy.create
méthode, puisque vous vous intéressez à l' set
et get
pièges, je vous laisse vraiment un exemple simple:
var p = Proxy.create({
get: function(proxy, name) { // intercepts property access
return 'Hello, '+ name;
},
set: function(proxy, name, value) { // intercepts property assignments
alert(name +'='+ value);
return true;
}
});
alert(p.world); // alerts 'Hello, world'
p.foo = 'bar'; // alerts foo=bar
Essayer ici.
Le Proxy de l'API est donc de nouveau qui n'est pas encore documenté sur le Mozilla Developer Center, mais comme je l'ai dit, un travail de mise en œuvre a été inclus depuis le Firefox 3.7 pré-versions.
L' Proxy
objet est disponible dans la portée globale et l' create
méthode peut prendre deux arguments, un handler
de l'objet, qui est simplement un objet qui contient des propriétés nommées comme des pièges que vous souhaitez mettre en œuvre, et une option proto
argument, qui vous rend capable de spécifier un objet que votre proxy hérite.
Les pièges sont disponibles:
// TrapName(args) Triggered by
// Fundamental traps
getOwnPropertyDescriptor(name): // Object.getOwnPropertyDescriptor(proxy, name)
getPropertyDescriptor(name): // Object.getPropertyDescriptor(proxy, name) [currently inexistent in ES5]
defineProperty(name, propertyDescriptor): // Object.defineProperty(proxy,name,pd)
getOwnPropertyNames(): // Object.getOwnPropertyNames(proxy)
getPropertyNames(): // Object.getPropertyNames(proxy)
delete(name): // delete proxy.name
enumerate(): // for (name in proxy)
fix(): // Object.{freeze|seal|preventExtensions}(proxy)
// Derived traps
has(name): // name in proxy
hasOwn(name): // ({}).hasOwnProperty.call(proxy, name)
get(receiver, name): // receiver.name
set(receiver, name, val): // receiver.name = val
keys(): // Object.keys(proxy)
La seule ressource que j'ai vu, en plus de la proposition en elle-même est le tutoriel suivant:
Edit: Plus l'information est en train de sortir, Brendan Eich a récemment donné une conférence à l' JSConf.ue de la Conférence, vous pouvez trouver ses diapositives ici: