@stan288

Почему у Proxy object лишние элементы в массиве?

Есть такой прокси-массив
const historyArr = new Proxy([], {
    get(target, property) {
        return target[property]
    },
    set(target, property, value) {
      if (target.length > 9) {
        target.pop();
      }
      target.unshift(value);
      return true;
    }
  });


63cd7db8c98a5510238164.png
когда добавляю в него элементы, почему-то добавляется длина массива в отдельный индекс.
Почему такое поведение? Мне не нужна длина в массиве, я ведь её не добавляю, откуда она берется и как от этого явления избавиться?
  • Вопрос задан
  • 184 просмотра
Пригласить эксперта
Ответы на вопрос 2
@historydev Куратор тега JavaScript
Острая аллергия на анимешников
Длина это тоже property:
const historyArr = new Proxy([], {
    get(target, property) {
    		console.log(property)
        return target[property]
    },
    set(target, property, value) {
      if (target.length > 9) {
        target.pop();
      }
      target.unshift(value);
      return true;
    }
  });
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
Как работает метод push, особое внимание на пятый и шестой пункты - устанавливается значение, устанавливается новая длина массива. Поскольку push вы взываете у proxy, а не у оригинального массива, то и при установке значения, и при установке новой длины срабатывает обработчик set.

Как избавиться от такого поведения... Конечно, можно в обработчике set ничего не делать при попытке установить значение length. Правда, так вы тоже получите побочные эффекты, например - невозможность напрямую назначить длину массива; при выполнении pop'а, несмотря на то, что элемент будет удалён, длина массива не изменится и т.п.

Так что стоит подумать - а действительно ли для решения стоящей перед вами задачи надо использовать proxy.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
29 мар. 2024, в 17:14
4000 руб./за проект
29 мар. 2024, в 17:04
5000 руб./за проект
29 мар. 2024, в 17:03
3000 руб./за проект