Jest tylko jedna rzecz, istniejąca w tej chwili, że rzeczywiście może robić, co chcesz, ale niestety nie jest powszechnie stosowane:
Istnieją tylko dwa pracy implementacje dostępne w tej chwili, w najnowszych Firefox 4 beta (to jest już od FF3.7 wstępnych wersjach) oraz w node-proxy na stronie serwera JavaScript - Chrome i Safari aktualnie nad nim pracują-.
Jest jednym z early proposals dla next version of ECMAScript, to API, które pozwala na wdrożenie zwirtualizowanych obiekty (proxy), w którym można przypisać różne pułapek -callbacks-, które są wykonywane w różnych sytuacjach, zyskujesz pełną kontrolę nad tym, co w tym czasie - w ECMAScript 3/5- mogą robić tylko obiekty hosta.
Aby zbudować obiekt proxy, trzeba użyć metody Proxy.create
, ponieważ jesteś zainteresowany set
i get
pułapek, zostawiam wam bardzo prosty przykład:
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
Wypróbuj here.
Proxy API jest tak nowy, że nie jest nawet udokumentowane w Mozilla Developer Center, ale, jak powiedziałem, od czasu premier wersji Firefoksa 3.7 dołączono działającą implementację.
Przedmiotem Proxy
jest dostępny w zasięgu globalnym i metoda create
może trwać dwa argumenty, o handler
obiekt, który jest po prostu obiekt, który zawiera właściwości nazwanych jako pułapki chcesz wprowadzić i opcjonalny proto
argumentu, że umożliwia określenie obiektu, z którego dziedziczy serwer proxy.
Pułapki dostępne są:
// 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)
Jedynym zasobem widziałem, oprócz wniosku przez siebie jest następujący poradnik:
Edit: Więcej informacji wychodzi, Brendan Eich niedawno wygłosił przemówienie na JSConf.eu konferencji można znaleźć tutaj swoje slajdy:
Czy kiedykolwiek znalazłeś rozwiązanie? –
Pytanie było bardziej wywołane ciekawością niż potrzebą, próbowałem użyć Rhino jako silnika skryptowego dla aplikacji Java i polegało na tworzeniu js wrapperów dla obiektów hosta i ich metod - i właściwości. Ostatecznie przerzuciłem się na Clojure, ponieważ łatwiej było rozmawiać z Javą, chociaż tworzenie dynamicznych serwerów proxy jest rzeczywiście trudniejsze w Clojure niż w JavaScript. – TomSW
Powiązane: http://stackoverflow.com/q/11144589/1348195 Wysłałem tam również odpowiedź przy użyciu nowego interfejsu API serwera proxy. –