Попытка стать менее запуганным прототипом JavaScript

Всего через пару недель изучения JavaScript одной из моих любимых функций языка стал прототип объекта.

Сначала я нашел эту концепцию довольно ошеломляющей, особенно когда я увидел, что она появляется во многих функциях.

Однако после просмотра отличного вступления Тайлера МакГинниса по теме* все стало обретать гораздо больше смысла.

*(https://www.youtube.com/watch?v=XskMWBXNbp0)

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

Может быть очень интересно посмотреть на них в консоли. Например, чтобы просмотреть прототип объекта Array, все, что вам нужно сделать, это ввести в консоль следующее:

Array.prototype

Это может позволить нам взглянуть на прототип и ознакомиться с тем, что мы можем делать с массивами.

Это все, чем является Array Prototype: просто объект, содержащий все, что вы можете с ним делать!

Прототипы исправления обезьян

Как и другие объекты, мы можем получить доступ к определенным значениям в прототипе, если нам это нужно. Например:

Array.prototype.pop.name
<- "pop"

И, как и другие объекты, мы можем их редактировать. Это может дать нам дополнительную функциональность для массивов, которая не включена в прототип массива по умолчанию.

Например, что, если вам удобнее программировать на Ruby и вам не хватает некоторых встроенных методов работы с массивами?

Мы можем добавить их в наш прототип массива JavaScript, если захотим.

Array.prototype.first = function() { return this[0]; }

Теперь мы можем вызывать .first для наших массивов JavaScript!

Давайте попробуем что-нибудь посложнее. Массивы JavaScript имеют встроенную функцию .filter() для выбора всех элементов, которые удовлетворяют любому переданному аргументу. Но в JavaScript нет противоположной функции, которая будет выбирать все элементы, которые не удовлетворяют данный аргумент. Например. .reject() в рубине.

Посмотрим, сможем ли мы сделать это сами…

Array.prototype.reject = function(inputFunction) {
 rejectArray = []
 this.forEach(function(element) {
  if(inputFunction(element) === false) {
   rejectArray.push(element);
    }
  });
 return rejectArray
;}

После долгих экспериментов это было самое простое решение, которое я смог найти.

Сначала мы создаем пустой файл rejectArray. Затем мы перебираем наш this(массив, для которого мы хотим вызвать функцию.

Мы передаем каждый элемент this через inputFunction, и если он возвращает false, мы добавляем его в rejectArray. Наконец, мы возвращаем rejectArray, который теперь будет содержать все элементы, которые не удовлетворяют нашему входному аргументу.

Давайте проверим, сможем ли мы отклонить все четные числа из следующего массива:

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Итак, мы хотим получить массив только с нечетными числами. Давайте попробуем!

arr.reject(element => element % 2 === 0)
<- [1, 3, 5, 7, 9]

Это сработало!

Редактирование встроенных прототипов объектов, также известное как «исправление обезьян», обычно не рекомендуется по многим причинам. Это может сбивать с толку других разработчиков, использующих ваш код, а обновленные версии JavaScript могут мешать терминологии, которую вы используете в своих исправлениях.

Это может вызвать у вас меньше головной боли в будущем, если вместо этого использовать объектно-ориентированный подход и назначать желаемую функциональность классу.

Объекты без прототипов

Вы можете посмотреть на все это и подумать про себя: «А, значит, у каждого объекта в JavaScript есть прототип, верно?»

Ответ… не совсем.

Вы можете создать объект, который не имеет прототипа следующим образом:

prototypelessObject = Object.create(null, { foo: {value: "bar" }})

Этот «нуль» сообщает вашему объекту, что вы хотите создать его без какого-либо связанного с ним прототипа.

Это может показаться не особенно полезным, но может пригодиться при создании игр с использованием JavaScript. Это потому, что это позволяет вам перерабатывать свои объекты, сокращая «мусор», который может привести к паузе в игре. Это выходит за рамки этого блога, но я нашел этот пост полезным, чтобы дать вам введение в тему:



Выводы

  • Прототипы становятся намного менее страшными, когда вы относитесь к ним как к обычным объектам.
  • Обезьянье исправление может быть забавным способом привыкнуть к прототипам, но его следует использовать с осторожностью.
  • Беспрототипный объект возможен и иногда может быть полезен!