Попытка стать менее запуганным прототипом 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. Это потому, что это позволяет вам перерабатывать свои объекты, сокращая «мусор», который может привести к паузе в игре. Это выходит за рамки этого блога, но я нашел этот пост полезным, чтобы дать вам введение в тему:
Выводы
- Прототипы становятся намного менее страшными, когда вы относитесь к ним как к обычным объектам.
- Обезьянье исправление может быть забавным способом привыкнуть к прототипам, но его следует использовать с осторожностью.
- Беспрототипный объект возможен и иногда может быть полезен!