Подтвердить что ты не робот

Переопределить объектную скобку [index] getter/setter в JavaScript?

В настоящее время я создаю Doubly linked list.
То, что я пытаюсь (или надеюсь) сделать, - использовать setter/getter для установки элементов в списке, как и в массиве:

var index = 5;
list[index] = node_x;

Однако я не могу просто использовать этот синтаксис, потому что узлы не являются технически свойствами списка.
Подумайте о списке как 2 крючка. Эти 2 крючка соединены с 2 концами цепи, но вы можете получить доступ только к этим двум соединительным цепным звеньям (и их братьям и сестрам через них).
Остальные звенья цепи не являются свойствами списка. Поэтому мне нужно переопределить реализацию скобок [] на моем объекте, если это возможно.

Мой (упрощенный/сокращенный) код:

(function () {
    "use strict"
    window.List = function () {
        var Length //Etc
        return {
            //Getter / Setter example.
            get length() {return this.Length;},
            set length(n) {this.Length = n;},
            //Function example.
            insertBeginning: function (newNode) {/*  */},
            insertEnd: function (newNode) {/*  */},

            //Index getter / setter attempt.
            get i(index){ console.log(index); },
            set i(index, node){ console.log(index); }
        };
    };

}());

var list = new List();
list.length = 10 //This works just fine
console.log(list.length) // Returns 10, like expected.

Теперь, что я пытался сделать с i getter/setter, нужно установить такие элементы:

var index = 5;
list.i(index) = node;

Но, конечно, это не работает, поскольку:

  • i не является функцией;
  • Я не могу назначить переменные функции, очевидно.

Я мог бы, конечно, просто использовать функцию для установки элементов:

list.setAtIndex(index, node);

Но я бы предпочел как-то переопределить нотацию массива для объекта.

Итак, мой вопрос, возможно ли это? И если да, могу ли я получить некоторые подсказки? Мои попытки поиска возвратили ресурсы как это, я знаю, как теперь работают геттеры/сеттеры.

4b9b3361

Ответ 1

Помимо того, что это плохая идея, это просто невозможно.

Ответ 2

Я хотел бы предложить, что это очень плохая идея. Стоимость получения элемента по индексу я для связанного списка равна O (n). Доступ к связанному списку по индексу - ошибка Java, которую другие не должны повторять. Эта ошибка не была сделана для С++ и С#.

Массивы часто работают лучше для случайной вставки и удаления в большинстве случаев, потому что стоимость линейного поиска O (n) полностью доминирует с точки зрения производительности, а массивы лучше работают для предварительной выборки. Нет, действительно: http://bulldozer00.com/2012/02/09/vectors-and-lists/

Я предлагаю использовать реализацию связанного списка без доступа к индексу вообще, когда вы действительно можете доказать, что получите выгоду от использования связанного списка, возможно, для реализации очереди. Я предлагаю использовать встроенные массивы для всех остальных случаев. В дополнение к тому, чтобы быть лучше в целом для большинства применений, вы получите гораздо больше оптимизаций для встроенных массивов, чем для любой реализации связанных сторонних списков.

Ответ 3

Я не знаю, хотите ли вы этого, но посмотрите на него.

codepen.io ex

Я думаю, что это пока не полностью удовлетворительно, потому что по умолчанию говорит, что при предоставлении параметров вы хотите получить доступ к set.