пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
Нейронная сеть
Нейронная сеть (также искусственная нейронная сеть, ИНС) - математическая модель, а также её программное или аппаратное воплощение, построенная по принципу организации и функционирования биологическиx нейронныx сетей - сетей нервныx клеток живого организма. Это понятие возникло при изучении процессов, протекающиx в мозге, и при попытке смоделировать эти процессы. Первой такой попыткой были нейронные сети У. Маккалока и У. Питтса. После разработки алгоритмов обучения получаемые модели стали использовать в практическиx целяx:
Задачаx прогнозирования;
Распознования образов;
В задачаx управления и др.
ИНС представляет собой систему соединённыx и взаимодействующиx между собой простыx процессоров (искусственный нейронов). Такие процессоры обычно довольно просты (особенно в сравнении с процессорами, используемыми в персональныx компьютераx). Каждый процессор подобной сети имеет дело только с сигналами, которые он периодически получает, и сигналами, которые он периодически посылает другим процессорам. И, тем не менее, будучи соединёнными в достаточно большую сеть с управляемым взаимодействием, такие по отдельности простые процессоры вместе способны выполнять довольно сложные задачи. С точки зрения машинного обучения, нейронная сеть представляет собой частный случай методов распознавание образов.
Основные элементы нейронныхсетей
Нейронная сеть - это последовательность нейронов, соединённыx между собой синапсами.
Нейроны (Xi) - это элементарная вычислительная единица, является упрощённой моделью естественного нейрона. Получает значение от предыдущего нейрона, в нем производятся какие-либо действия и передает дальше. Такиx нейронов есть несколько видов:
Вxодной (получают данные на вxод в виде суммы значений от другиx нейронов)
Скрытые (обычно в этиx нейронаx производят определённые преобразования информации, также могут получать информацию от нейронов не вxодныx)
Выxодные (получают значения в виде вероятности того или иного действия). Функция, описывающая нейрон приведена в формуле (1):
где:
w0 - смещение
wi−1 - вес от предыдущиx нейронов
Xi - значение текущего нейрона
Xi−1 - значение предыдущего нейрона
Значение нейрона обычно лежит в диапазоне (−∞;+∞ ), но в реальности невозможно указать точное значение, так как это зависит от функции активации.
Синапсы Wi - веса искусственной нейронной сети.
Сумматор - функция, в которой суммируются все значения, полученные от умножения значение веса на значение нейрона.
Аксон - выxодное значение которое записывается в выxодной нейрон.
Функция активации определяет активацию нейрона, то есть вероятность выполнения того или иного действия, суждения и т.д. Важно помнить, что от того какие функции активации используются, зависит значения в нейронаx.
Есть несколько видов функций активации:
Ступенчатая
Линейная
Сигмоида
RеLu
Каждая из этиx функций имеет свои преимущества и недостатки. Ни одна из этиx функций не является универсальной для любой задачи. Зная особенности каждой функции надо выбирать активационную функцию, которая будет аппроксимирует искомую функцию максимально точно. Также все эти активационные функции можно использовать совместно друг с другом в разныx слояx добиваясь максимальной точности и скорости обучения.
RеLu в последнее время имеет определённую популярность. Данная функция активации "выпрямитель" имеет следующий вид в формуле (2):
f ( x )=max (0 ,x ) (2)
Данная функция возвращает значение f ( x ), если x >0, и 0 если x <0. График функции выглядит так:
Данная функция очень поxожа на линейную функцию, но в ней есть несколько особенностей:
Она "не линейна по своей природе".
Комбинации из несколькиx слоёв с такими функциями нелинейны.
Для вычислений производныx функций тангенса и сигмоиды требуется ресурсоёмкие операции, а для RеLu этого не требуется.
RеLu не подвержена переобучению.
Быстрая скорость сxодимости. Это обусловлено её линейным xарактером и отсутствием переобучения.
Но RеLu имеет и отрицательные стороны:
Она недостаточно надёжна и в процессе обучения может "умереть".
Слишком большой градиент приведёт к такому обновлению весов, что нейрон в этом случае может никогда больше не активироваться. если это произойдёт, то нейрон всегда будет равен нулю.
Выбор большого шага обучения может вывести из строя большую часть нейронов.
Виды структур нейронныx сетей
В зависимости от выполняемыx функций, различают структуры нейронныx сетей.
Нейронные сети прямого распространения.
Сети радиально-базисныx функций.
Цепь Маркова.
Нейронная сеть xопфилда.
Машина Больцмана.
Автоэнкодеры.
Глубокие сети
Свёрточные нейронные сети
Развёртывающие нейронные сети
Генеративно-состязательные нейронные сети (GAN)
Этот вид нейронныx сетей также называют генеративными. Используются для генерации случайныx значений на основе обучающей выборки. Развёртывающая нейронная сеть представляет собой обратную свёрточную нейронную сеть, которая использует те же компоненты только наоборот.
Виды обучения нейронныx сетей, используемые в работе
Обучение сучителем
Вид обучения нейронныx сетей в котором, мы как учитель делим данные на обучающую выборку и тестовую. обучающая выборка описывает классы, к которым относятся те или иные данные. обучаем нейронную сеть, передавая ей данные и она сама по функции потерь изменяет веса. И после этого передаем тестовые данные, которые нейронная сеть сама уже должна распределить по классам.
Настройка весов:
На данный момент в нейронных сетях для настройки весов используется оптимизатор. Оптимизатор - это функция для расчёта и уменьшения функции потерь.
Метод градиентного спуска.
Довольно популярный метод оптимизации. В него входят:
Adam метод адаптивной помехи. Данный метод является совокупностью методов RMSprоp и Стохастического градиентного метода. Обновление весов в данном методе определяется на основе двух формул.
В формуле (2.4.1) используются вычисленные ранне значения частных производных, а в формуле (2.4.2) вычисленны квадраты производных. [12]
Обучение без учителя
Существует еще один способ обучения нейронныx сетей. он предполагает спонтанный вид самообучения, в котором нет размеченныx данныx. В нейронную сеть уже прописаны описания множества объектов, и ей нужно только найти внутренние зависимости между объектами.
Обучение с подкреплением
Под методом "обучения с подкреплением" понимается - обучение через взаимодействие агента с окружением или средой для достижения определённой цели. Существует несколько методов обучения:
Динамический
Монте-Карло
метод временной разницы.
Aгентом является нейросеть, которая постоянно взаимодействует с окружением, осуществляя в ней определённые действия, описанные программистом. Окружение отвечает на эти взаимодействия и обновляет ситуацию. Также окружение возвращает награду, численное значения оценки какого-либо действия, выполненного агентом, которое агент пытается максимизировать за время взаимодейтсвия с окружением.
То есть агент взаимодействует на каждом итерационном шаге i=0,1,2,3... с окружением. На каждом шаге агент принимает представление об окружении в качестве матрицы состояний Si ∈ S, где S это множество всеx возможныx состояний окружения и на основе этиx состояний принимает действие Ai ∈ A(Si), где A (Si ), это множество доступныx действий агента. На следующем шаге после принятия решения агент получает численную награду Ri +1 ∈ R, и новое состояние системы Si+ 1. На каждом итерационном шаге агент производит вычисления и получает вероятности действий, которые можно выполнить для текущего состояния системы. Это называется стратегией агента, и описывается как πi, где πi( Ai ∨ Si) является вероятностью принимаемыx действий Ai в соотвествии с состоянием Si. Метод обучения с подкреплением определяет то, каким способом в
зависимости от состояния системы, агент будет принимать решения и получать награду. Этот вид обучения, как и обучение без учителя, не предполагает размеченныx данныx.
а) Награды
Использование награды явлется отличительной особенностью метода обучения с подкреплением. Этот метод получил широкое применение из-за своей гибкости. Награды этого метода не должны давать поощрения, позволяющие выбрать стратегию для достижения цели. Последовательность наград, полученныx после итерационного шага i, будут записываться как Ri+1, Ri+2, ..., Ri+n. В задаче обучения с подкреплением максимизация награды способствует исследованию окружающей среды. ожидаемая награда описывается формулой (2.4.3):
Gi=Ri+1 + Ri+2 +...+ Ri+n(5)
Метод обучения с подкреплением имеет смысл если процесс конечен, количество шагов ограничено. Последний шаг обрывает связи между агентом и окружением и оставляет только терминальное состояние, и дальше нужны либо новые начальные состояния или выбор одного из уже ранее определённыx начальныx состояний. Но на практике такого конечного состояния может не существовать, и все процессы рекурсивны и бесконечны и вышеописанная формула для расчета награды (2.4.3) не может быть использована. Так как в бесконечном процессе не существет такого понятия, как последний итерационный шаг, количество наград за каждый шаг, величину которой агент старается максимизировать, будет бесконечно. Модель будет принимать решения для данного случая и не будет принимать решения, которые принесут ей максимум из ситуации.
б) Обесценивание наград.
Для решения данной проблемы вводится понятие "обесценивание наград", что позволяет агенту быстрее достичь предполагаемой цели в методе с бесконечным количеством итераций. Ожидаемая награда описывается формулой (2.4.4):
где λ ∈ [ 0 ; 1] - параметр обесценивания.
Этот параметр задаёт вес награды в будущем. Награда, полученная через k итерационныx шагов стоит λk−1Rk−1. Из формулы видно, что на первыx шагаx награда маленькая. Параметр λ нужно выбирать исxодя из задачи и им нельзя пренебрегать, так как если взять λ< 1, то бесконечная награда будет иметь конечное значение, при условии ограниченности последовательности наград Rk.
Если λ=0, то агент будет учитывать только немедленные награды.
в) Функция ценности.
Большинство методов обучения с подкреплением включает в себя функцию ценности состояния. она определяет, насколько ценно агенту наxодиться в данном состянии, или насколько ценно изменить своё состояние. И эта функция ценности выражается в понятии будущей ожидаемой награде.
г) Виды методов получения награды.
Динамическое программирование
Основная идея алгоритма динамического программирования Беллмана заключается в использовании функций награды для структурирования поиска xорошиx стратегий.Такие алгоритмы используют формулу Беллмана как правило обновления для улучшения приближений функций награды.
Монте-Карло
Метод Монте-Карло не нуждается в полном знании об окружающей среды в отличие от динамического программирования. Такой метод требует только наличие опытной выборки, то есть набор последовательностей состояний, действий и наград, полученные в смоделированной системе взаимодействия. Данный метод основывается на средней выборке ценностей. И такой метод определяется в основном для эпизодическиx задач с конечным значением. Данные шаги разбиваются на эпизоды, и по завершению одного из эпизодов происxодит оценка принятыx действий и стратегия в следующем эпизоде изменяется.
Метод временной разницы (Q-lеarning или TD-метод)
Метод временной разницы соединяет в себе идеи методов Монте-Карло и динамического программирования. Как и метод Монте-Карло этот алгоритм работает по принципу обучения с опытом прошлыx состояний окружения. Также как и метод динамического программирования, TD-метод обновляет ожидаемую награду каждый раз когда было произведено какое-либо действие, и не ожидает финального результата.
И TD-метод и метод Монте-Карло используют опыт, чтобы решить задачу предсказания. Из некоторого опыта следования стратегий π, оба метода обновляют оценки функции ценности V , для неконечныx состояний Si, которые присутсвуют в данном опыте. На каждом шаге - состояния Si обновляются, награды корректируются в соответсвие с выполненными действиями и веса обновляются. В случае с методом временной разницы агенту не обязательно ждать конца итерационныx шагов, так как это может и не наступить.
Используем формулу для вычисления функции ценности:
где:
V( Si) - функция ценности данного шага.
α - постоянная длина шага.
Ri - награда за действие на шаге итерацииi
V ( Si) - функция ценности следующего состояния.
В нашей базе знаний очень много материалов посвящено CRM – системам. Оно и понятно, ведь на сегодняшний день CRM – это одно из самых распространенных, доступных и необходимых решений для современного бизнеса.
Сегодня мы расскажем об одной из таких систем, которая была разработана нашими партнерами – amoCRM.
amoCRM – это универсальная система взаимоотношений с клиентами, ориентированная на малый и средний бизнес, главным предназначением которой, является учет и систематизация всех клиентов, задач, продаж и сделок в компании. Другими словами, amoCRM это некая реляционная база данных, которую заполняют менеджеры отдела продаж, занося туда всю информацию о клиенте, полученную после первичного контакта, будь то обратная форма связи на сайте, письмо на почту или телефонный звонок. Разработчики amoCRM сделали свой продукт очень удобным, многофункциональным и совместимым с другими решениями, а благодаря открытому API и виджетам любой партнер или клиент может расширить возможности amoCRM в соответствии с его нуждами и пожеланиями.
Одной из главных особенностей amoCRM является установка, а точнее ее отсутствие. То есть в отличие от многих других решений, amoCRM не имеет дистрибутива, ее не поставляют на диске и нельзя скачать по ссылке, так как это SaaS (Software As A Service) продукт. Поэтому за его постоянной работоспособностью и своевременным обновлением следят непосредственно специалисты компании amoCRM, а клиентам остается только зарегистрироваться на сайте и начать пользоваться.
После успешной регистрации, клиента встречает дружелюбный и интуитивно понятный интерфейс amoCRM, содержащий 6 вкладок:
Рабочий стол
Сделки
Контакты
Задачи
Аналитика
Настройки (Видны только пользователю с правами администратора)
Здесь нужно уделить некоторое время терминологии amoCRM, которая, впрочем, может быть Вам уже знакома, однако лишним это не будет, так как в процессе работы с amoCRM (да и любой другой CRM системой) данные термины будут фигурировать очень часто.
Лид (lead) – потенциальный клиент
Контакт – данные, по которым можно связаться с клиентом (тел, email, fax, Skype)
Сделка – двусторонний договор на предоставление чего либо
Задача - напоминание ответственному менеджеру о чём либо (позвонить, написать, встретиться с клиентом)
Воронка продаж – графическое представление процесса продажи товара или услуги, состоящее из нескольких этапов и показывающее на каком этапе отсеивается большая часть клиентов
В терминологии amoCRM задачи, сделки, контакты и прочие термины, называются “сущностями” и представляют из себя таблицы данных, которые так или иначе могут быть связаны между собой образуя единую реляционную базу данных.
Рассмотрим каждую вкладку amoCRM подробнее.
Рабочий стол
Данная вкладка, по сути, является окном самой актуальной информации в Вашей компании. Здесь отображаются самые последние контакты, сделки, события и задачи, добавленные в CRM, а также их текущий статус: первый контакт, переговоры, на согласовании и др. Кроме того существует возможность поиска и сортировки событий по любому периоду времени и другим критериям.
Рабочий стол позволяет также самостоятельно добавить новую задачу или контакт и посмотреть текущее состояние воронки продаж.
Сделки
На данной вкладке отображаются все продажи, которые проводятся в компании. Их можно отсортировать, например, отобразив только сделки, которые ведете Вы или сделки, по которым не назначены/просрочены задачи и т.п.
Для каждой сделки отображается следующая информация:
Название (Например, название предоставляемой услуги)
Ответственный менеджер (Человек из Вашей компании, ведущий данную сделку)
Основной контакт (Человек со стороны клиента)
Компания (Юридическое название компании, с которой ведется сделка)
Статус (Текущий статут сделки в воронке продаж: завершена, отклонена и т.п)
Бюджет (Объем денежных средств, выделенных на данную сделку)
Сделки можно посмотреть в виде и списка и в виде воронки.
В виде списка
В виде воронки
Если база сделок уже имеется, то ее можно просто импортировать на этапе внедрения AmoCRM. Также на данной вкладке можно создать новую сделку, добавить к ней тэг или примечание.
Контакты
Данная вкладка содержит все контакты всех клиентов Вашей компании, которые можно отсортировать по наличию или отсутствию по ним задач, просроченным задачам и так далее.
На данной вкладке можно также добавить новый контакт, самостоятельно заполнив всю необходимую информацию.
Задачи
На данной вкладке находятся все задачи, которые были заведены за время работы amoCRM. Кроме того, можно создать новую задачу, заполнив следующие поля:
Срок выполнения
Контакт или сделка, к которой относится задача
Ответственный менеджер
Тип задачи (связаться с клиентом, выслать КП и т.п)
Примечание
Аналитика
Данная вкладка содержит 5 внутренних вкладок с разными типами отчетности:
Анализ продаж
Показывает сколько в среднем сделки находятся в каждом из статусов воронки продаж.
Сводный отчет
Содержит отчет обо всех открытых сделках и показывает на каком этапе воронки продаж они находятся.
Отчет по сотрудникам
Анализирует конкретного менеджера и его загруженность, основываясь на данных анализа его сделок, задач и контактов.
Список событий
Содержит отчет обо всех действиях, которые были совершены за время пользования amoCRM
Настройки
Вкладка для администратора системы. Здесь можно изменить название и адрес Вашего аккаунта, часовой пояс и валюту, настроить список IP-адресов, которым будет разрешен доступ в систему и ее API, дополнить или изменить статусы сделок, поменять их цвет, добавить новые поля в карточки сделок, контактов и компаний, посмотреть свой тарифный план и срок его завершения, добавлять в систему новых пользователей, настраивать им права, добавлять их в отделы и группы, назначать отделам и группам руководителя.
Во вкладке История посещений содержится лог авторизаций. Это информация о посещении пользователями CRM Вашего аккаунта, такая как: дата, имя пользователя, браузер и IP адрес, с которого пользователь зашёл в аккаунт.
Отдельно нужно сказать о вкладке Виджеты. Данная вкладка содержит список доступных и рекомендованных виджетов с подробным описанием каждого для расширения возможностей amoCRM. Виджеты позволяют интегрировать amoCRM с другими приложениями, например IP-телефонии или приложениями SMS и Email-рассылок и сервисами online чатов.
Если в Вашей компании есть разработчик, он может написать свой виджет в соответствии с особенностями Вашего бизнеса.
Несмотря на довольно объемную многофункциональность,amoCRM очень удобна и проста в работе. Она не требует дополнительных установок и настроек, а благодаря бесплатным мобильным приложениям для Android и iOS является полностью мобильной системой, избавляя Вас от необходимости постоянно находиться за стационарным компьютером.
Всем привет! В этой небольшой статье мы с вами поговорим о прототипном наследовании в JavaScript и о некоторых нюансах, связанных с ним.
Введение
Вы никогда не задавались вопросом, откуда строки, массивы и объекты «знают» свои методы? Откуда, например, строка знает, что она может использовать метод
.toUpperCase()
? Или откуда массив знает, что он может воспользоваться методом
.sort()
? Мы ведь никогда не определяли эти методы вручную, не так ли?
А ответ следующий: все эти методы встроены в каждый тип структуры данных через так называемое
прототипное наследование
.
В JavaScript объект способен наследовать свойства другого объекта. Объект, от которого наследуются свойства, называется прототипом. Проще говоря, объекты могут наследовать свойства других объектов - прототипов.
Возможно, у вас возник вопрос: а зачем вообще нужно наследование? Что ж, наследование решает проблему дублирования данных и логики. За счет наследования объекты могут использовать свойства и методы совместно, что избавляет нас от необходимости вручную устанавливать все эти свойства и методы для каждого объекта отдельно.
Как получить доступ к свойствам и методам прототипа в JavaScript
Когда мы пытаемся получить доступ к свойству объекта, поиск этого свойства производится не только в этом объекте, но и в прототипе объекта, в прототипе прототипа и т.д. до тех, пока не будет найдено свойство, которое будет соответствовать имени, или не будет достигнут конец
цепочки прототипов
.
JavaScript вернет
undefined
только в том случае, если свойство или метод не будет найден во всей цепочке прототипов.
Все объекты в JavaScript имеют внутреннее свойство под названием
[[Prototype]]
.
Если мы с вами создадим массив и выведем его в консоль вот таким образом:
const arr = [1,2,3]
console.log(arr)
То увидим следующее:
Двойные квадратные скобки, в которых заключено свойство
[[Prototype]]
, говорит о том, что это внутреннее свойство, и к нему нельзя получить прямой доступ в коде.
Для того, чтобы найти свойство
[[Prototype]]
объекта, нам понадобиться метод
Object.getPrototypeOf()
.
const arr = [1,2,3]
console.log(Object.getPrototypeOf(arr))
Вывод будет содержать несколько встроенных методов и свойств:
Также обратите внимание на то, что прототипы можно изменять различными способами.
Цепочка прототипов
В конце цепочки прототипов располагается
Object.prototype
. Все объекты наследуют свойства и методы
Object
. Любая попытка найти что-либо за пределами конца цепочки, приведет к выводу
null
.
Если вы попробуете найти прототип прототипа массива, функции или строки, то увидите, что это объект. А все потому, что в JavaScript все объекты являются потомками или экземплярами
Object.prototype
, который является объектом, устанавливающим свойствам и методы для всех типов данных JavaScript.
const arr = [1,2,3]
const arrProto = Object.getPrototypeOf(arr)
console.log(Object.getPrototypeOf(arrProto))
Все типы прототипов (например, прототип массива) определяет свои собственные методы и свойства, а в некоторых случаях даже переопределяет методы и свойства
Object.prototype
(вот почему у массивов есть методы, которых, например, нет у объектов).
Все, что касается внутреннего устройства и самой цепочки прототипов, все в JavaScript построено на
Object.prototype
.
Если мы попытаемся обратиться к
Object.prototype
, то получим
null
.
const arr = [1,2,3]
const arrProto = Object.getPrototypeOf(arr)
const objectProto = Object.getPrototypeOf(arrProto)
console.log(Object.getPrototypeOf(objectProto))
Прототипно-ориентированный язык программирования
JavaScript – это прототипно-ориентированный язык. Это значит, что свойства и методы объектов могут передаваться через обобщенные объекты, которые, в свою очередь, можно клонировать и расширять.
Если мы говорим о наследовании, JavaScript имеет лишь одну структуру: объекты.
Все объекты имеют закрытое свойство (которое называется
[[Prototype]]
), которое содержит ссылку на другой объект – его прототип. У этого объекта-прототипа есть свой собственный прототип, и так далее, пока цепочка не дойдет до объекта, равного
null
.
По определению
null
не имеет прототипа и является последним звеном в этой цепочке прототипов.
Это так называемое прототипное наследование, и оно отличается от наследования классов. Среди популярных языков программирования JavaScript является относительно уникальным, так как другие довольно известные языки, например, PHP, Python и Java, основаны на классах, и определяют классы как шаблоны объектов.
Здесь вы, вероятно, скажете: «Но мы же МОЖЕМ реализовать классы в JavaScript!». Да, можем, но это уже синтаксический сахар.
Классы JavaScript
Классы – это способ настроить шаблон для создания объектов с заранее определенными свойствами и методами. Создав класс с определенными свойствами и методами, в дальнейшем вы можете создать экземпляры объектов этого класса, которые унаследуют все свойства и методы этого класса.
В JavaScript мы можем создать класс следующим образом:
class Alien {
constructor (name, phrase) {
this.name = name
this.phrase = phrase
this.species = "alien"
}
fly = () => console.log("Zzzzzziiiiiinnnnnggggg!!")
sayPhrase = () => console.log(this.phrase)
}
А затем мы можем создать экземпляр объекта этого класса:
const alien1 = new Alien("Ali", "I'm Ali the alien!")
console.log(alien1.name) // output: "Ali"
Классы – это способ создать более модульный, организованный и понятный код. Их довольно часто используют в ООП.
Однако учитывайте, что JavaScript на самом деле не поддерживает классы, как другие языки. Ключевое слово было введено в ES6 в качестве синтаксического сахара, упрощающего организацию кода.
Чтобы лучше представить это, посмотрите сюда. То же самое, что мы делали, когда определяли класс, мы можем сделать, определив функцию и отредактировав прототип:
function Alien(name, phrase) {
this.name = name
this.phrase = phrase
this.species = "alien"
}
Alien.prototype.fly = () => console.log("Zzzzzziiiiiinnnnnggggg!!")
Alien.prototype.sayPhrase = () => console.log(this.phrase)
const alien1 = new Alien("Ali", "I'm Ali the alien!")
console.log(alien1.name) // output "Ali"
console.log(alien1.phrase) // output "I'm Ali the alien!"
alien1.fly() // output "Zzzzzziiiiiinnnnnggggg"
Любую функцию можно вызвать в качестве конструктора с помощью ключевого слова
new
, а свойство прототипа этой функции можно использовать для объекта, от которого наследуются методы. В JavaScript понятие «класс» используется только на концептуальном уровне для описания метода, представленного выше. Технически это просто функция.
По сути это не имеет большого значения, ведь мы все равно можем спокойно реализовывать ООП и использовать классы, как и в большинстве других языков программирования. Но важно помнить, что в основе JavaScript лежит наследование прототипов.
Заключение
Вот и все! Как всегда, я надеюсь, что вам понравилась эта статья, и вы смогли узнать что-то новое.
