Я хотел бы иметь функцию javascript, которую я могу создать, и поймать каждый неопределенный метод, который вызывается ему (Proxy Trap).
До сих пор я так:
var MyProxyFunction = new Proxy(function () {
console.log(">>>>>>>>>>>>>>>>>>>> constructor");
}, {
get: function(target, prop) {
if (target[prop] === undefined) {
return function() {
console.log('an otherwise undefined function!!');
};
}
else {
return target[prop];
}
}
});
Теперь, если я вызову MyProxyFunction.foo()
, он будет вызван (я увижу, что "конструктор" отключен, и журнал из функции get).
Но то, что я хотел бы сделать, это создать экземпляр этого объекта (и сделать некоторую инициализацию в конструкторе) следующим образом:
var myObj = new MyProxyFunction();
myObj.foo();
Но когда я делаю это, я получаю, что foo()
не является функцией. Зачем? и как я могу заставить его работать при создании экземпляра прокси?
Объяснение этого поведения заключается в том, что ваш конструктор проксирован, но не объекты, которые он создает. Поэтому, когда вы пишете new MyProxyFunction
прокси-конструктор, но конструктор создает новый объект, который не имеет ничего общего с Proxy
, но с свойством prototype
конструктора.
Существует несколько способов заставить его работать.
function MyProxyFunction() {
console.log(">>>>>>>>>>>>>>>>>>>> constructor");
};
MyProxyFunction.prototype = new Proxy(MyProxyFunction.prototype, {
get: function(target, prop) {
if (target[prop] === undefined) {
return function() {
console.log('an otherwise undefined function!!');
};
}
else {
return target[prop];
}
}
});
var myObj = new MyProxyFunction();
myObj.foo();
console.log('constructor:', myObj.constructor.name);
console.log('Is instance of MyProxyFunction?: ', myObj instanceof MyProxyFunction);
Теперь немного странно использовать имя MyProxyFunction, поскольку оно не является самой функцией (конструктором), которая проксирована.
Если вы хотите создать конструктор, который создает новый прокси каждый раз, когда вы создаете объект с ним, не назначайте new Proxy
непосредственно MyProxyFunction
, а сделайте его простой конструкторной функцией, которая возвращает new Proxy
.
Объект, который у вас есть для прокси-сервера, - this
.
function MyProxyFunction() {
console.log(">>>>>>>>>>>>>>>>>>>> constructor");
return new Proxy(this, {
get: function(target, prop) {
if (target[prop] === undefined) {
return function() {
console.log('an otherwise undefined function!!');
};
}
else {
return target[prop];
}
}
});
}
var myObj = new MyProxyFunction();
myObj.foo();
console.log('constructor:', myObj.constructor.name);
console.log('Is instance of MyProxyFunction?: ', myObj instanceof MyProxyFunction);