В настоящее время существует только одна вещь, которая может делать то, что вы хотите, но, к сожалению, не получила широкого распространения:
На данный момент доступно только две рабочие реализации, в последних бета-версиях Firefox 4 (это было со времен предварительных выпусков FF3.7) и в node-proxy для серверного JavaScript - Chrome и Safari в настоящее время работают над ним -.
Это одно из ранних предложений для следующей версии ECMAScript , это API, который позволяет реализовывать виртуализированных объектов (прокси), где Вы можете назначить множество ловушек -callbacks-, которые выполняются в разных ситуациях, вы получаете полный контроль над тем, что в это время в ECMAScript 3 / 5- могут делать только хост-объекты.
Чтобы построить прокси-объект, вы должны использовать метод Proxy.create
, так как вас интересуют ловушки set
и get
, я оставляю вам очень простой пример:
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
Попробуйте здесь .
Proxy API настолько нов, что даже не документирован в Mozilla Developer Center, но, как я уже сказал, со времени предварительных выпусков Firefox 3.7 была включена рабочая реализация.
Объект Proxy
доступен в глобальной области видимости, а метод create
может принимать два аргумента: объект handler
, который представляет собой просто объект, содержащий свойства, названные ловушками, которые вы хотите реализовать, и необязательный аргумент proto
, позволяющий указать объект, от которого наследуется ваш прокси.
Доступны ловушки:
// 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)
Единственный ресурс, который я видел, кроме самого предложения, это следующий учебник:
Редактировать: Появляется дополнительная информация, Брендан Айх недавно выступил с докладом на конференции JSConf.eu , его слайды можно найти здесь: