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

в настоящее время я строю двусвязный список реализация.
То, что я пытаюсь (или надеюсь) сделать, - это использовать сеттер / геттер для установки элементов в списке, как и в массиве:

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

однако, я не могу просто использовать этот синтаксис, потому что узлы не являются технически свойства списка.
Думаю из списка, а 2 крючка. Эти 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;

но конечно, это не работа, с:

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

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

list.setAtIndex(index, node);

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

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

3 ответов


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

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

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


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


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

кодепен.io ex

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