Я изучаю прокси-сервер JavaScript. Используя ловушку set, я хочу добавить только четное число в массив. Но каждый раз бросать Uncaught TypeError: 'set' на прокси: trap возвращал ложное значение для свойства 'length' Здесь ...

4
sahed moral 3 Мар 2021 в 18:05

2 ответа

Лучший ответ

Вам нужно вернуть {{X 0}} в обоих случаях, потому что

Возвращаемое значение < / a>

Метод set() должен возвращать логическое значение.

push дважды вызывает прокси, один раз нажимая значение, а второй раз изменяя свойство length. Чтобы избежать ненужных дополнительных действий в этом прокси, вы можете выйти раньше с этим нежелательным свойством.

let evenNumbers = [];

evenNumbers = new Proxy(evenNumbers, {
    set (target, p, value, receiver) {
        if (p === 'length') return true; // exclude this property
        if (value % 2 === 0) {
            target[p] = value;
        }
        return true;
    }
});

evenNumbers.push(2);
console.log(evenNumbers.length); // 1
evenNumbers.push(3);
console.log(evenNumbers.length); // Still 1
console.log(evenNumbers);        // [ 2 ]
5
T.J. Crowder 3 Мар 2021 в 15:30

Проблема в том, что функция .push() пытается обновить длину (evenNumbers.length = 1), а это не разрешено ловушкой.

Попробуй это:

let evenNumbers = [];

evenNumbers = new Proxy(evenNumbers, {
    set(target, p, value, receiver) {
        if ( isFinite(p) ) {
            // The key is a number (index), so there's code trying to add/change an element of the array.
            if ( (value % 2) === 0 ) {
                target[p] = value;
                return true
            }else {
                return false;
            }
        } else {
            return true;
        }
    }
});

evenNumbers.push(2); // OK
evenNumbers.push(3); // TypeError
0
D. Pardal 3 Мар 2021 в 15:14