Proxy JavaScript через функцию
Я изучаю Proxy в JavaScript и пытаюсь сделать Proxy для создания массива через new.
Я хочу использовать функцию, вместо переменной но у меня не получается.
Я закомментировал мою неработающую функцию, хочу, чтобы эта функция работала также как и const. Не понимаю, почему не происходит тот же самый вывод
//function IndexedArray(args) {
// return new Proxy(Array, {
// construct(target, [args]) {
// return new target(...args);
// }
// });
//}
const IndexedArray = new Proxy(Array, {
construct(target, [args]) {
return new target(...args);
}
});
const users = new IndexedArray([1, 2, 3]);
console.log(users);
UPD:
По советам @Grundy я попробовал сделать return этого прокси с оператором new, но это не тоже самое, что с const.
Вот, результаты:
function IndexedArray(args) {
let a = new Proxy(Array, {
construct(target, [args]) {
return new target(...args);
}
});
console.log('func', new a(args));
return new a(args);
}
const IndexedArray1 = new Proxy(Array, {
construct(target, [args]) {
console.log('const:', new target(...args));
return new target(...args);
}
});
const users = new IndexedArray([1, 2, 3]);
const users1 = new IndexedArray1([1, 2, 3]);
console.log('');
const users2 = IndexedArray([1, 2, 3]);
const users3 = IndexedArray1([1, 2, 3]);
Ответы (1 шт):
Основная ошибка в том, что там где ожидается объект Proxy в коде с функцией появляется функция, который этот объект возвращает.
Исходя из этого, чтобы результат был одинаковым - нужно предварительно получить этот объект
function IndexedArray(args) {
return new Proxy(Array, {
construct(target, [args]) {
return new target(...args);
}
});
}
const IndexedArray1 = new Proxy(Array, {
construct(target, [args]) {
return new target(...args);
}
});
var IndexedArrayProxy = IndexedArray();
const users = new IndexedArrayProxy([1, 2, 3]);
console.log(users);
const users1 = new IndexedArray1([1, 2, 3]);
console.log(users1);
Также можно применять и более сложную технику со скобками, чтобы не сохранять отдельной переменной:
function IndexedArray(args) {
return new Proxy(Array, {
construct(target, [args]) {
return new target(...args);
}
});
}
const IndexedArray1 = new Proxy(Array, {
construct(target, [args]) {
return new target(...args);
}
});
const users = new(IndexedArray())([1, 2, 3]);
console.log(users);
const users1 = new IndexedArray1([1, 2, 3]);
console.log(users1);
Во втором примере кода, проблема та же, только теперь функция всегда возвращает результат, который нужен только для оператора new.
Для решения можно просто проверить, вызывается ли функция как конструктор или нет и в зависимости от этого
function IndexedArray(args) {
let a = new Proxy(Array, {
construct(target, [args]) {
return new target(...args);
}
});
if (new.target)
return new a(args);
return a(args);
}
const IndexedArray1 = new Proxy(Array, {
construct(target, [args]) {
return new target(...args);
}
});
const users = new IndexedArray([1, 2, 3]);
const users1 = new IndexedArray1([1, 2, 3]);
console.log(users, users1)
console.log('');
const users2 = IndexedArray([1, 2, 3]);
const users3 = IndexedArray1([1, 2, 3]);
console.log(users2, users3)