Рубрики
Без рубрики

Hayden Betts, что мы действительно имеем в виду, когда мы говорим о прототипных формах Rawpixel на Unsplashbeginning JavaScript Devs, часто ошибочно используют одно слово – «прототип» – ссылаться на две разные концепции. Но то, что именно разница между «прототипом объекта» и «свойством прототипа» функций JavaScript? Но почему…

Hayden Betts, что мы действительно имеем в виду, когда мы говорим о прототипных формах Rawpixel на Unsplashbeginning JavaScript Devs, часто ошибочно используют одно слово – «прототип» – ссылаться на две разные концепции. Но то, что именно разница между «прототипом объекта» и «свойством прототипа» функций JavaScript? Но почему…

Автор оригинала: FreeCodeCamp Community Member.

Hayden Betts.

Начало JavaScript Devs часто ошибочно использует одно слово – «прототип» – ссылаться на две разные концепции. Но то, что именно разница между «прототипом объекта» и «свойством прототипа» функций JavaScript?

Я думал, что понял концепцию «прототипов» и прототипов наследования в JavaScript. Но я продолжал охватить себя смущенным ссылками на «прототип» в коде и в документации.

Многие из моих путаницы исчезли, когда я понял, что В письменном виде о JavaScript люди часто несущественно используют «прототип» на Опишите два отчетливый, но связанный концепции.

  1. Прототип объекта : Объект шаблона, из которого еще один объект JavaScript наследует методы и свойства. ( MDN )
  2. Неремиемое Прототип Свойство на функции JavaScript : Удобство для облегчения конструкции шаблона (эта модель дизайна будет подробно объяснена вскоре!) Отказ Не имеет смысла в себе, пока намеренно не установит функцию, связанную с наследством. Наиболее полезно при использовании с функциями конструктора и заводских функций (пояснение!). Хотя все функции JS имеют свойство по умолчанию. Содержит Конструктор Свойство, которое относится к оригинальной функции.

Долгое время мне было удобно с определением 1, но не с определением 2.

Почему этот различительный вариант?

Прежде чем я понял разницу между «прототипом объекта», а также «неремиемую Prototype свойство на функциях», – я обнаружил, что смущен выражениями, как следующее:

Array.prototype.slice.call([1, 2], 0, 1);// [ 1 ]

(боковая панель: первый – но не единственный – шаг к пониманию вышеупомянутого понимания вызов() Отказ Вот быстрый переподготовка так, на всякий случай!)

Вопрос, который я ранее не мог ответить:

  • «Почему мы ищем ломтик в Array Прототип конструктора? Не должен быть Array сам конструктор содержать Slice метод, и его прототип просто содержит некоторые действительно низкие Методы уровня, которые все объекты имеют? “

Эти вопросы были полностью очищены, когда я пришел, чтобы понять рисунок дизайна, который Прототип Недвижимость на Массив Конструкторные функции существуют, чтобы включить.

3 шага для понимания свойства прототипа на функциях JS

Для того, чтобы понять Прототип Свойство на функциях JS, вам нужно понять рисунок дизайна, который он позволяет. Я построю понимание этого шаблона, сначала работая через две менее предпочтительные альтернативы.

Реализация 1: Функциональный класс

Представьте, что мы хотим создать игру, в которой мы взаимодействуем с собаками. Мы хотим быстро создать много собак, которые имеют доступ к общим методам, как Pet и гад.

Мы могли бы начать реализовать нашу игру, используя Функциональный класс Pattern следующим образом:

Давайте немного очистим, хранив эти методы в своем собственном объекте. Затем продлить их внутри создан Заводская функция.

Хотя эта реализация легко рассуждает, и удобно отражает классовое наследование на других языках, у него есть как минимум один важный вопрос: мы копируем определения нашего метода каждому объекту собаки, мы создаем, используя нашу фабрику создан Отказ

Это занимает больше памяти, чем необходимо, и это не Сухой Отказ Не было бы неплохо, если вместо того, чтобы исправить определения метода для Зевс и Кейси , мы могли бы определить наши методы в одном месте. Тогда есть Зевс и Кейси Укажите на это место?

Refactor 1: Реализация «прототипового класса».

Прототипов наследования дает нам именно то, что мы просили выше. Это позволит нам определить наши методы в одном объекте прототипа. Тогда есть Зевс , Кейси и бесконечно больше объектов, как они указывают на этот прототип. Зевс и Кейси Затем будут иметь доступ ко всем методам и свойствам этого прототипа посредством ссылки.

Большой! Теперь объекты, соответствующие Зевс и Кейси Сами не содержат копии методов гадость и Pet Отказ Вместо этого объекты смотрят на эти методы в своем прототипе МетодовыеFORSHOWSACKUCTION Отказ

Но не было бы неплохо, если МетодовыеFORSHOWSACKUCTION были инкапсулированы в создан Заводская функция? Это позволит понять, что эти методы предназначены для использования только с этой функцией. Так что простой рефактор оставляет нас:

Refactor 2: прототип наследования + прототип свойства на заводских функциях

Большой! Но не МетодовыеFORSHOWSACKUCTION и долгое и странное имя для недвижимости? Почему бы не использовать что-то более общее и предсказуемое? Оказывается, дизайнеры JavaScript предоставляют нам только то, что мы ищем. Встроенный Прототип Свойство на каждую функцию, включая один на нашей фабричной функции создан Отказ

Обратите внимание, что в этом нет ничего особенного Прототип имущество. Как показано выше, мы могли бы достичь точно такого же результата, установив прототип создан до отдельного объекта под названием МетодовыеFORSHOWSACKUCTION Отказ Нормальная форма Прототип Свойство по функциям в JavaScript предлагает его предполагаемое использование: удобство, предназначенное для облегчения общего шаблона дизайна. Ни больше ни меньше.

Дальнейшее чтение:

Подробнее о Прототип Свойство по функциям в JavaScript, см. Раздел «Функция Prototype» в это Blogpost от Себастьян Порто Отказ

MDN Статья на прототипах.