В 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 и стараюсь быть максимально четким и техническим в своем общении на языке. Спасибо за чтение!