В JavaScript есть много способов создания объектов, необходимых для выполнения данной задачи. В этом большом странном языке иногда мне нужно сделать шаг назад, чтобы понять основы того, как все это работает. Сегодня мы рассмотрим связанный список, который я написал в шаблоне Functional Instantiation.
Что такое конструктор объектов?
Конструктор объекта — это просто средство для создания объекта с помощью какой-то функции. Вы предоставляете аргумент[ы] (или пользователя) функции, и функция выдает объект с вашим аргументом[ами] в качестве свойств объекта!
Существуют различные способы создания конструктора объектов, но, на мой взгляд, проще всего понять функциональную реализацию.
Давайте немного разобьем шаблон.
Функция должна возвращать объект
const LinkedList = function() { const obj = {}; return obj; } const newList = LinkedList(); console.log(newList) //returns {}
Конструкторы объектов всегда возвращают объекты, но ключевой момент, который следует помнить при создании функциональных экземпляров, заключается в том, что объект определяется и возвращается внутри функции.
Параметры функции должны быть свойствами возвращаемого объекта.
const LinkedList = function(element) { const node = {}; node.item = element; node.next = undefined; return node; } const newList = LinkedList('pizza'); console.log(newList) // returns {item: 'pizza', next: undefined}
Вряд ли это уникальная концепция среди конструкторов объектов, но о ней стоит упомянуть. Если мне нужен конструктор объекта, который будет полезен мне в любом случае, мне нужно иметь возможность подключать аргументы, которые станут свойствами возвращаемого объекта.
Методы объекта должны существовать внутри самого объекта
const LinkedList = function(element) { const node = {}; node.item = element; node.next = undefined; node.add = function(element) { if (node.next === undefined) { return node.next = LinkedList(element); } else { return node.next.add(element); } } return node; } const newList = LinkedList('pizza'); newList.add('pineapple'); newList.add('bacon'); console.log(newList); /* returns { item: 'pizza', add: function, next: { item: 'pineapple', add: function, next: { item: 'bacon', add: function, next: undefined } } } */
В этом заключается как основное преимущество, так и недостаток функционального шаблона инстанцирования. Все заключено в одну изящную маленькую функцию, поэтому ее легко читать, но наш метод add переопределяется для каждого создаваемого нами узла! Этот подход удобен для чтения, но расточительно занимает компьютерную память.
Вызов:
Создайте связанный список с более полезными методами в функциональном шаблоне создания экземпляров.
pop: должен удалить последний узел в списке.
slice: должен удалить первый элемент в любом месте списка, значение которого равно предоставленному аргументу (БОНУС: заставить его работать с массивами и объектами)
shift: должен удалить первый узел из списка.
listAll: должен возвращать массив всех значений в связанном списке от начала до конца.
Не стесняйтесь вносить любые исправления и / или предложения. Я все еще новичок в мире ведения блогов и JavaScript и стараюсь быть максимально четким и техническим в своем общении на языке. Спасибо за чтение!