JavaScript - использование ловушки прокси при создании объекта

1

Я хотел бы иметь функцию 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() не является функцией. Зачем? и как я могу заставить его работать при создании экземпляра прокси?

Теги:

1 ответ

0
Лучший ответ

Объяснение этого поведения заключается в том, что ваш конструктор проксирован, но не объекты, которые он создает. Поэтому, когда вы пишете new MyProxyFunction прокси-конструктор, но конструктор создает новый объект, который не имеет ничего общего с Proxy, но с свойством prototype конструктора.

Существует несколько способов заставить его работать.

1. Применить прокси-сервер к прототипу объекта

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, поскольку оно не является самой функцией (конструктором), которая проксирована.

2. Создайте прокси для каждого экземпляра

Если вы хотите создать конструктор, который создает новый прокси каждый раз, когда вы создаете объект с ним, не назначайте 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);
  • 0
    Благодарю. Но на самом деле мне нужен этот дополнительный новый. Поскольку мне нужно создать несколько разных экземпляров одной и той же функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню