admin / 09.08.2018

Анонимные самовызывающиеся функции и функции обратного вызова в JavaScript.

Домашнее задание

Что такое ООП?

Важно понимать концепцию ООП, поэтому расскажите что такое ООП и что такое объекты?

Посмотреть ответ

ООП или объектно-ориентированное программирование это одна из частей программирования, которая основана на создании классов и объектов.

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

Основные концепции

Назовите 4 основных концепции ООП, а также вкратце расскажите что они делают и за какие функции отвечают.

Посмотреть ответ

4 концепции ООП: полиморфизм, абстракция, инкапсуляция и наследование.

Что они означают написано выше под видео, поэтому не будем дублировать информацию повторно.

Объекты

Что такое экземпляр и как много их может быть?

Посмотреть ответ

Экземпляр это просто объект класса, некая область памяти, которая вмещает в себе все характеристики взятые из класса: поля, методы, конструкторы.

У одного класса может быть бесконечное количество объектов (экземпляров).

Большое задание по курсу

Вам необходимо оформить подписку на сайте, чтобы получить большое задание. Такие задания есть к каждому курсу. В них входит задание, методика решения, а также «Готовое решение».
PS: подобные задания доступны только при подписке от 1 месяца!

ПредыдущийСледующий

Также стоит посмотреть

Анонимные самовызывающиеся функции и функции обратного вызова в JavaScript.

Всем привет! Недавно мы рассмотрели различия между function declaration и function expression, сегодня мы рассмотрим, как использовать анонимные самовызывающиеся функции и функции обратного вызова.

Функции обратного вызова

Рассмотрим такой код

Здесь мы передаем в функцию другую функцию, которую потом вызываем. Вот так теперь мы можем использовать наш код.

Мы определили свою функцию, которая передается в параметре.

ООП в Javascript

Такой тип функций называется «функции обратного вызова» или callback по-английски.

Самовызывающиеся функции

Как понятно из названия, такие функции вызываются сами.

Рассмотрим небольшой пример

Как вы можете видеть, мы обернули функцию в круглые скобки, после чего снова поставили круглые скобки в конце функции и передали туда нужный аргумент. Такая функция вызовется сразу же, как до нее дойдет интерпретатор, поэтому мы увидим «Привет, Ivan», хотя мы данную функцию не вызывали.

Такие функции также очень часто используются на практике.

Например, такой тип функций используется для реализации паттерна модуль.

Итак, на этом все. Спасибо за внимание и удачи!

  • Создано 08.08.2014 20:28:07

  • Михаил Русаков

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так:

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):
  • listОсновы ООПexpand_more
  • В этой части курса мы рассмотрим основы ООП в JavaScript. Вспомним различные способы создания объектов, освежим в памяти принципы работы прототипов и посмотрим какую роль в JavaScript играют классы.

  • listИнкапсуляцияexpand_more
  • Инкапсуляция заключается в объединении данных и функций, изменяющих эти данные в рамках одного объекта. Также инкапсуляция заключается в сокрытии внутреннего механизма работы объектов и предоставлении публичного интерфейса. В этой части курса мы рассмотрим различные способы определения публичных и приватных свойств объектов.

  • listНаследованиеexpand_more
  • Наследование является главной отличительной чертой ООП. В JavaScript наследование очень отличается от классической системы наследования, применяемой в большинстве языков. В этой части курса мы рассмотрим принцип прототипного наследования, а также различные альтернативные методы наследования, применяемые в JavaScript.

  • listПолиморфизмexpand_more
  • Полиморфизм (поли — много, морф — форма) — это механизм основанный на системе типизации, позволяющий алгоритму работать с разными типами данных. Полиморфизм тесно связан с таким понятием как интерфейс, который определяет форму объекта. В JavaScript отсутствует строгая система типов и интерфейсов, от чего полиморфизм основан на принципе утиной типизации, согласно которому если у объекта имеется метод (крякать), то должно быть это утка. В этой части курса мы рассмотрим принципы реализации полиморфизма в JavaScript.

  • listКомпозицияexpand_more
  • Наследование, являясь основным принципом ООП, не лишено недостатков.

    Главной проблемой наследования является жесткая структура классов, которая со временем образуется. В такой система очень сложно вносить изменения, которые неизбежны. Альтернативой наследования является композиция и ее вариации — ассоциация и агрегация. В отличие от других принципов ООП, композиция отлично вписывается в JavaScript. В этой части курса мы рассмотрим классическую реализацию композицию через классы, а также рассмотрим несколько вариантов композиции объектов без использования классов.

  • listSOLID-принципыexpand_more
  • Объектно-ориентированный код можно писать плохо, а можно писать хорошо. Для того чтобы писать его хорошо, нам нужно придерживаться ряда принципов, проверенных временем.

    Синтаксис ООП в js и использование prototype

    Первые буквы названий этих принципов образуют акроним SOLID. В этой части курса мы рассмотрим SOLID-принципы в контексте JavaScript.

  • listПаттерны проектированияexpand_more
  • ООП уже немолодая дисциплина и за время её существования сформировались общепринятые решения для часто возникающих проблем при разработке. Эти решения называются паттернами проектирования. У каждого паттерна есть запоминающееся название и четкая ситуация в которой паттерн применяется. Т.е. паттерн — это рецепт или набор шагов для решения конкретной задачи. В этой части курсы мы рассмотрим основные паттерны проектирования, применяемые в JavaScript.

    Понятие ООП в JavaScript

    ООП (Объекто-ориентированное программирование) — это принципиально новый вид программирования. ООП используется не только в JavaScript, но и в других языках тоже. И о понятии ООП я Вам и расскажу в этой статье.

    В основе ООП лежит объект. Объект — это некая сущность, у которой есть свойства и методы, позволяющие этими свойствами манипулировать. Вот такое сухое определение, но зато полностью отражающее суть объекта. Чтобы стало ещё понятнее, давайте приведу пример из жизни. Самый популярный пример — это автомобиль. Какие свойства могут быть у автомобиля? Например, может быть максимальная скорость, ускорение, количество передач, масса, цвет, текущие координаты местоположения автомобиля и так далее. Теперь, какие могут быть методы ? Это может быть метод «перекраски автомобиля», который занимается перекрашиванием автомобиля в другой цвет. Это может быть метод «движения», которая занимается изменением текущих координат местоположения и так далее.

    Думаю, что с объектами всё достаточно понятно.

    Теперь о классах. Класс — это некий шаблон для создания объектов. Имено в классе написаны, какие свойства и методы будут у объекта. Также у класса есть конструктор, который занимается созданием объектов. Другими словами, класс — это шаблон и фабрика для создания объектов.

    Теперь поговорим о трёх китах ООП: инкапсуляция, наследование и полиморфизм.

    Начнём с инкапсуляции. Инкапсуляция — это процесс сокрытия части объекта от пользователя. Для того чтобы было легче понять, что такое инкапсуляция, привожу пример. Допустим, Вы набираете текст в Word. Знаете ли Вы, что в этот момент Вы посылаете огромное количество бит из 0 и 1? Известно ли Вам, как они обрабатываются? Известно ли Вам, как они превращаются в символы, которые Вы видите на экране? И вообще, как происходит вывод на ЖК-монитор? Скорее всего, Вы об этом даже не задумывались. То есть реализация всей этой физики от Вас скрыта. Это и есть инкапсуляция. Вы можете спокойно использовать объекты и их функциональность, но при этом Вам совсем не надо знать, как это работает. И это очень удобно и для пользователя, и для программиста.

    Теперь поговорим о наследовании. Наследование — механизм ООП, позволяющий создавать классы на основе других классов, забирая их свойства и методы. Снова пример из жизни. Ведь согласитесь, что объект «Автомобиль» — это абстрактность. Ведь существуют элементарно легковые и грузовые автомобили. То есть родительский класс (или как его ещё называют супер-класс) «Автомобиль» и два дочерних (или наследника, или производных): «Легковые автомобили» и «Грузовые автомобили». Принцип легковых и грузовых автомобилей один и тот же. То есть у каждого из них есть свойства «автомобиля» (максимальная скорость, ускорение и прочее) и методы (перемещения, перекраски). Однако, свойства будут немного другого значения (например, масса у грузовых машин, как правило, выше). А реализация методов будет другая (ведь перекрасить грузовую машину — это немного другое, нежели перекрасить легковую, хоть и принцип примерно один и тот же).

    И последняя парадигма ООП — это полиморфизм. Самый сложный для понимания «кит», однако, не менее важный, чем другие. Полиморфизм — это взаимозаменяемость объектов. Или другими словами, объект может иметь много форм. Например, объект «Автомобиль» может иметь две формы «Грузовые автомобили» и «Легковые автомобили». И если мы вызовем метод «перекраски автомобиля», то в зависимости от того, с каким объектом мы работаем, объект будет перекрашиваться как «грузовой автомобиль» или как «легковой автомобиль». Ведь мы можем, например, потребовать в качестве параметра функции объект «Автомобиля», но ведь мы не знаем, какая именно форма придёт в функцию: «легковой автомбиль» или «грузовой автомобиль». Однако, мы точно знаем, что все методы, которые мы применяем внутри функции к этому объекту будут корректно обрабатываться. Надеюсь, что-то прояснилось, однако, если это не так, то ничего страшного. В принципе, для JavaScript ООП не так важно, поэтому тут достаточно и общих понятий.

    А вообще тема ООП достаточно сложная и по ней пишут огромное количество толстенных книг, поэтому в одной статье трудно раскрыть эту тему. Однако, я постарался это сделать максимально понятным языком, и в то же время, чтобы у Вас появились общие понятия.

    Что же касается JavaScript, то тут ООП как такового нет, однако, концепции ООП JavaScript подчиняется. Существуют две части JavaScript (их несколько больше, но для 90% случаев их вполне достаточно). Первая часть — это ядро языка JavaScript. Здесь содержатся классы, отвечающие за математические операции, строковые операции, работу с массивами и так далее. Вторая часть — это клиентская.

    Объектно-ориентированное программирование в JavaScript

    Здесь содержатся классы, которые отвечают за объекты на HTML-страницах, такие как: формы, кнопки, текстовые поля, ссылки, изображения, различные другие элементы страницы. Со многими объектами мы познакомимся в следующих статьях. А пока хватит.

    Спасибо за внимание!

    • Создано 10.10.2010 17:44:55

    • Михаил Русаков

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:

      Она выглядит вот так:

    2. Текстовая ссылка:

      Она выглядит вот так: Как создать свой сайт

    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Инкапсуляция с помощью замыканий в JavaScript

    Одной из необычных особенностей JavaScript является инкапсуляции с помощью замыканий. Необычной потому, что во многих других языках программирования этот механизм реализован с помощью классов. В JavaScript же другой механизм, который может показаться странным, если не разобраться в особенностях переменных и функций.

    Если переменная или объект в JavaScript не помещены внутрь какой-либо функции, то они становятся глобальными. Все глобальные элементы в JavaScript являются свойствами глобального объекта. Для браузера это объект window. При этом конструкции for, if и другие не влияют на видимость переменных.

    Создание глобальных переменных, как правило, нежелательно, так как оно может привести к трудно обнаружимым ошибкам, и усложняет перенос кода в другие приложения.

    Например, если написать библиотеку следующего содержания foo.js:

    А потом подключить её к проекту:

    То переменная из библиотеки перезапишет начальное значение переменной, и в результате в последнем alert, будет выведено Привет, а не Пока. Принято минимизировать использование глобальных переменных, скрывая(инкапсулируя) все данные в классах.

    Инкапсуляция — это помещение всех данных и функций, объединенных одним смыслом в единую сущность. При этом не нужные для пользователя данные скрываются внутри сущности и доступны только внутри неё.
    В объектно-ориентированных языках, инкапсуляция достигается благодаря применению модификаторов доступа. В JavaScript для организации инкапсуляции применяются замыкания.
    Замыкание — это функция + все внешние переменные, которые ей доступны.
    Доступ к переменных в функциях осуществляется следующим образом. Все переменные внутри функции в JavaScript — это свойства объекта LexicalEnvironment, так называемое лексическое окружение. Данный объект является внутренним и к нему нет доступа.

    Кроме того, в специальном внутреннем свойстве у функции хранится объект [[scope]]. В нём хранятся внешние для данной функции переменные.

    Прототипное объектно-ориентированное программирование в JavaScript

    Функция сначала ищет переменные в LexicalEnvironment и если не находит, ищет в [[scope]]. Таким образом, функция сначала ищет объявления нужных элементов внутри себя, и лишь потом обращается к внешним элементам. При этом из внешней области берётся именно текущее значение переменной. Кроме того, в JavaScript внутри функций можно объявлять и другие функции.

    Ярким примером замыканий может служить код счётчика:

    Благодаря замыканиям, внутренняя функция имеет доступ к переменной Count и может возвращать его значения во внешний код, в тоже время пользователи функции useCounter не имеют прямого доступа к переменной Count, для них она не видима. Благодаря применению замыканий, переменная Count оказалась скрыта внутри функции useCounter.

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

    Таким образом замыкания можно использовать и внутри объектов.

    Для реализации модулей можно использовать мгновенно вызванную функцию (immediately invoked function):

    В данном коде переменная msg доступна внутри функции showmsg, благодаря замыканию, а благодаря использованиюмгновенно вызванной функции, переменные не попадают в глобальный контекст.

    FILED UNDER : IT

    Submit a Comment

    Must be required * marked fields.

    :*
    :*