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