Ответ 1
Помимо того, что это плохая идея, это просто невозможно.
В настоящее время я создаю 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);
Но я бы предпочел как-то переопределить нотацию массива для объекта.
Итак, мой вопрос, возможно ли это? И если да, могу ли я получить некоторые подсказки? Мои попытки поиска возвратили ресурсы как это, я знаю, как теперь работают геттеры/сеттеры.
Помимо того, что это плохая идея, это просто невозможно.
Я хотел бы предложить, что это очень плохая идея. Стоимость получения элемента по индексу я для связанного списка равна O (n). Доступ к связанному списку по индексу - ошибка Java, которую другие не должны повторять. Эта ошибка не была сделана для С++ и С#.
Массивы часто работают лучше для случайной вставки и удаления в большинстве случаев, потому что стоимость линейного поиска O (n) полностью доминирует с точки зрения производительности, а массивы лучше работают для предварительной выборки. Нет, действительно: http://bulldozer00.com/2012/02/09/vectors-and-lists/
Я предлагаю использовать реализацию связанного списка без доступа к индексу вообще, когда вы действительно можете доказать, что получите выгоду от использования связанного списка, возможно, для реализации очереди. Я предлагаю использовать встроенные массивы для всех остальных случаев. В дополнение к тому, чтобы быть лучше в целом для большинства применений, вы получите гораздо больше оптимизаций для встроенных массивов, чем для любой реализации связанных сторонних списков.
Я не знаю, хотите ли вы этого, но посмотрите на него.
Я думаю, что это пока не полностью удовлетворительно, потому что по умолчанию говорит, что при предоставлении параметров вы хотите получить доступ к set
.