Запишу сюда, вдруг понадобится. Один раз уже пригодилось. Работающий пример javascript прокси.
function handlerMaker(obj)
{
return {
getOwnPropertyDescriptor: function(name)
{
console.log("getOwnPropertyDescriptor",name)
var desc = Object.getOwnPropertyDescriptor(obj, name);
// a trapping proxy's properties must always be configurable
if (desc !== undefined) { desc.configurable = true; }
return desc;
},
getPropertyDescriptor: function(name)
{
console.log("getPropertyDescriptor",name)
var desc = Object.getPropertyDescriptor(obj, name); // not in ES5
// a trapping proxy's properties must always be configurable
if (desc !== undefined) { desc.configurable = true; }
return desc;
},
getOwnPropertyNames: function()
{
console.log("getOwnPropertyNames")
return Object.getOwnPropertyNames(obj);
},
getPropertyNames: function()
{
console.log("getPropertyNames")
return Object.getPropertyNames(obj); // not in ES5
},
defineProperty: function(name, desc)
{
console.log("defineProperty", name, desc)
Object.defineProperty(obj, name, desc);
},
delete: function(name)
{
console.log("delete", name)
return delete obj[name];
},
fix: function()
{
console.log("fix")
if (Object.isFrozen(obj))
{
var result = {};
Object.getOwnPropertyNames(obj).forEach(function(name)
{
result[name] = Object.getOwnPropertyDescriptor(obj, name);
});
return result;
}
// As long as obj is not frozen, the proxy won't allow itself to be fixed
return undefined; // will cause a TypeError to be thrown
},
has: function(name)
{
console.log("has",name)
return name in obj;
},
hasOwn: function(name)
{
console.log("hasOwn",name)
return ({}).hasOwnProperty.call(obj, name);
},
get: function(receiver, name)
{
console.log("get", receiver, name)
return obj[name];
},
set: function(receiver, name, val)
{
console.log("set", receiver, name, val)
obj[name] = val;
return true;
}, // bad behavior when set fails in non-strict mode
enumerate: function()
{
console.log("enumerate")
var result = [];
for (var name in obj) { result.push(name); };
return result;
},
keys: function()
{
console.log("enumerate")
return Object.keys(obj);
}
}
}
var proxy = Proxy.create(handlerMaker({key:"asdf"}));
return proxy