///
///
export interface HandlerIF {
// Spec indicated define should return something but does not state what
defineProperty(name: string, desc: PropertyDescriptor): void;
delete (name: string): bool;
getPropertyNames(name: string): string[];
getOwnPropertyNames(name: string): string[];
getOwnPropertyDescriptor(name: string): PropertyDescriptor;
getPropertyDescriptor(name: string): PropertyDescriptor;
// Returns object containing name,PropertyDescriptor pairs
fix(): any;
// Properties must always be configuable, the reasoning is obscure
}
export interface ProxyIF {
create(handler : HandlerIF, proto?: any);
createFunction(handler, callTrap, constructTrap);
}
declare var Proxy: ProxyIF;
class ForwardHandler implements HandlerIF {
private wrapped : any= {};
constructor (obj?: any = {}) {
this.wrapped = obj;
}
defineProperty(name: string, desc: PropertyDescriptor): void {
Object.defineProperty(this.wrapped, name, desc);
}
delete (name: string): bool {
return delete this.wrapped[name];
}
getOwnPropertyNames() : string[] {
return Object.getOwnPropertyNames(this.wrapped);
}
getPropertyNames() : string[] {
var getPropertyNames = function (obj, name) {
if (obj === null) return [];
return Object.getOwnPropertyNames(obj).concat(
getPropertyNames(Object.getPrototypeOf(obj)));
}
return getPropertyNames(this.wrapped);
}
getOwnPropertyDescriptor(name: string) : PropertyDescriptor {
var desc = Object.getOwnPropertyDescriptor(this.wrapped, name);
if (desc !== undefined) desc.configurable = true;
return desc;
}
getPropertyDescriptor(name: string) : PropertyDescriptor {
var getPropertyDescriptor = function (obj, name) {
if (obj === null) return undefined;
var desc = Object.getOwnPropertyDescriptor(obj, name);
if (desc !== undefined)
return desc;
return getPropertyDescriptor(Object.getPrototypeOf(obj));
}
var desc = getPropertyDescriptor(this.wrapped, name);
if (desc !== undefined) desc.configurable = true;
return desc;
}
fix() {
var result = {};
Object.getOwnPropertyNames(obj).forEach(function(name) {
result[name] = Object.getOwnPropertyDescriptor(obj, name);
});
return result;
}
}
/* ==================================================================== */
class Tester {
}
var tester = new Tester()
var obj = Proxy.create(new ForwardHandler(tester))
obj.a = 1
console.log(obj.a)
console.log(tester)
console.log('Is a tester? : ' + (obj instanceof Tester))