Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы программирования на JavaScript. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
1 Мб
Скачать

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

1.5. Объекты функций JavaScript

В JavaScript 1.0/1.1 определение функции создает и дает имя функции, которую можно вызывать. Функции JavaScript – это значения объектов первого класса. Имя, объявляемое с помощью function, определяет глобальную переменную, похожую на объявление var на верхнем уровне кода. Ее значение – объект функции, которое может быть присвоено переменным, установлено значением свойства, передано как аргумент при вызовах функций и возвращено как значение из функций. Из-за того, что функции являются объектами, они могут иметь свойства, определенные для них. Следующий пример показывает, как свойство может быть добавлено к объекту функции:

function countedHello () { alert ("Hello, World!");

countedHello.callCount ++; // increment this

//function's callCount property

}

countedHello.callCount = 0; // associate

//counter with function and initialize

for (var i = 0; i < 5; i ++) countedHello (); alert (countedHello.callCount);

// displays: 5

Функции объявляются с формальным списком параметров, но размер списка параметров не ограничен количеством аргументов, которые могут быть переданы при вызове функции. Если функция вызывается с меньшим количеством аргументов, чем ее объявленное количество параметров, дополнительные параметры устанавливаются undefined. Если функция вызывается с большим количеством аргументов, чем количество формальных параметров, дополнительные аргументы вычисляются, но их значения недоступны через имена параметров. Однако объект аргументов, похожий на массив, доступен как значение свойства аргументов объекта функции во время исполнения тела функции. Все фактические аргументы, переданные при вызове в функцию, доступны как свойства с целочисленными ключами объекта аргументов. Это дает возможность написать функцию таким образом, что она сможет обрабатывать список аргументов переменной длины.

11

1.6. Встроенная библиотека JavaScript

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

Ранние разработки JavaScript были преимущественно направлены на потребности платформы браузера. Документация Netscape для ранних версий JavaScript не описывает явным образом различия между элементами библиотеки, зависящими и не зависящими от среды выполнения.

JavaScript 1.0 имеет только два класса объектов общего назначения: String и Date. Дополнительно существует единственный глобальный объект Math, чьи свойства – это часто используемые математические константы и функции.

Класс String имеет свойство length и шесть методов общего назначения, которые работают с неизменными строковыми значениями и в подходящих случаях возвращают новые строковые значения. Класс String JavaScript 1.0 также включает тринадцать методов, позволяющих заворачивать строковое значение в различные теги HTML. JavaScript 1.0 не имеет глобальной функции конструктора String. Все строковые значения создаются с помощью строковых литералов или операторов встроенных функций. JavaScript 1.1 имеет добавочно глобальный конструктор String и метод split.

Класс Date используется для представления календарных дат и времени. Этот класс в JavaScript 1.0 основывался на классе Java 1.0 для совместимости. Кроме Object, Date – это единственная используемая встроенная функция конструктора в JavaScript 1.0. Date – это также единственный класс, у которого доступны методы объекта конструктора в дополнение к методам для экземпляров класса. Ни один из классов, специфичных для браузера, не предоставляет доступ к функции конструктора.

Некоторые свойства объектов встроенной библиотеки имеют характеристики, которые недоступны для свойств, определенных программистами JavaScript. Например, их свойства методов не пронумерованы для оператора for-in. Некоторые из их свойств игнорируются оператором delete или имеют значения только для чтения. Доступ или изменение некоторых их свойств запускает особое поведение с видимыми побочными эффектами.

12

В JavaScript 1.1 был добавлен используемый класс Array. Конструктор Array создает объекты, предназначенные для использования в качестве индексированных целыми числами векторов из начала координат с разнотипными значениями. Элементы массива представляются как свойства объекта, чьи ключи являются строковым представлением их целочисленных индексов. Объекты массивов также имеют свойство length, значение которого изначально устанавливается конструктором. Значение свойства length обновляется при доступе к индексу элемента, большему или равному текущему значению length. Таким образом, количество элементов объекта массива может динамически расти.

1.7. Наименование стандарта

С начала процесса стандартизации было понятно, что наименование языка становится проблематичным. Изначальное название

Netscape «LiveScript» было заменено на «JavaScript» из-за стратегиче-

ского партнерства с компанией Sun. Sun зарегистрировала торговую марку «JavaScript» и предоставила ее Netscape. Хотя Sun поддерживала усилия по стандартизации скриптового языка Netscape, она также агрессивно защищала свои торговые марки, связанные с Java. Казалось невероятным, чтобы Sun уступила управление торговой маркой «JavaScript» организации по стандартизации.

Было достигнуто соглашение использовать название «ECMAScript», пока не будет найдено более подходящее название. Скотту Вилтамуту была поставлена задача сбора предлагаемых названий и проверки их доступности. Скотт Вилтамут представил список из шестнадцати потенциально жизнеспособных названий. Выборочный опрос общественного мнения идентифицировал главных кандидатов названия: LiveScript, ScriptJ, EZScript, Xpresso/Expresso/Espresso. Деле-

гатов Netscape и Sun попросили исследовать доступность названий

«LiveScript» и «JavaScript». В то же время название «ECMAScript»

продолжало использоваться в проектах спецификации.

Sun подтвердила, что она будет лицензировать «JavaScript» как «ECMAScript». Netscape утвердила, что не имеет возражений против использования названия «LiveScript» для стандарта. Однако «ECMAScript» все еще использовалось в проектах спецификации до тех пор, пока не было получено письменное подтверждение от Netscape.

Проект стандарта был подан по-прежнему с использованием «ECMAScript» в качестве названия языка. Стандарт был утвержден названием «ECMAScript», и поскольку другого решения не было достигнуто, он был опубликован с этим названием в качестве названия языка. Однако позднее организация по стандартизации выразила мне-

13

ние, что это название, вероятно, не будет использоваться, поскольку оно частично совпадает с названием European Computer Manufacturers Association (ECMA) и будет вводить в заблуждение пользователей. Это предсказание оказалось большей частью верным. Мир продолжил использовать название «JavaScript» для определения языка, который реализован в браузерах. Кроме того, это название сохранилось в спецификации элемента <script> HTML. Брендан Эйх также выразил мнение о том, что название «ECMAScript» нежелательно.

1.8. Получение признания JavaScript

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

Брендан Эйх не беспокоился об эффективности при создании языка в 1995 году. Когда ещё не было ни одной программы на JavaScript, ожидалось, что программы на нем будут просто дополнениями для реализации объектов в комплексе с другими более эффективными языками. JavaScript не предназначался для программирования даже алгоритмов средней сложности. Ранние машины JavaScript использовали или простые интерпретаторы байт-кода, или анализатор дерева вычислений для непосредственной интерпретации функций JavaScript и применяли простые схемы управления памятью. Они не использовали передовые методики высокоэффективных реализаций, которые были разработаны в 1980-х и ранних 1990-х годах для языков Lisp, Smalltalk, Self и других динамических языков программирования. Базовая архитектура браузеров компаний Netscape и Microsoft оставалась в основном неизменной в течение десятилетий. В то время обычно машина JavaScript поддерживалась единственным разработчиком программного обеспечения, работающим на неполную ставку. В 2000- х годах ситуация начала меняться. Разработчики стали задумываться об ограничениях эффективности машин JavaScript. Проводились сравнения эффективности работы JavaScript для браузеров.

Различные производители выбирали различные пути повышения производительности машин JavaScript. В 2006 году корпорация Google начала разработку того, что впоследствии стало браузером Chrome. Ларс Бак вел разработку машины V8 JavaScript для Chrome на основе методик, изученных при разработке виртуальных машин Smalltalk, Self и Java. Когда Chrome был выпущен в сентябре 2008 года, он

14

задал новую отправную точку для сравнения эффективности JavaScript. Другие браузеры также подвергались изменениям с целью повышения эффективности работы машин JavaScript.

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

1.9. Появление CommonJS и NodeJS

Начиная от своего зарождения, язык JavaScript также использовался на серверных платформах для обеспечения базовых скриптовых возможностей. Однако каждая платформа была уникальной и имела свои собственные Application Programming Interfaces (APIs) для JavaScript. За первые пятнадцать лет существования не было общей независимой от области применения и интероперабельной среды для приложений JavaScript не для браузеров. В январе 2009 года разработчик Кевин Дангур решил, что настало время это изменить. Он описал проблемы и пригласил сообщество JavaScript с серверной стороны помочь с решением этих проблем в дискуссионных группах. Год спустя он обобщил то, что изначально надеялся создать, в виде следующего списка:

модульную систему;

кросс-интерпретируемую стандартную библиотеку;

несколько стандартных интерфейсов;

систему пакетов;

репозиторий пакетов.

За первую неделю 224 члена присоединились к дискуссионной группе и многие из них проявили интерес к участию в проекте. Изначально инициатива получила название ServerJS, но в августе 2009 года была переименована в CommonJS, потому что эти технологии должны были найти применение за пределами серверов. Инициатива была сфокусирована на написании спецификаций, а не на внедрении.

К апрелю 2009 года группа имела начальный модуль спецификации. Разработчиками спецификации модулей CommonJS были Крис Ковал и Ихаб Авад. Модуль CommonJS – это тело функции JavaScript,

15

область видимости которого включает несколько связей, которые позволяют коду тела взаимодействовать с другими модулями. Это реализовано за счет синхронного загрузчика модуля, который добирается до исходного кода модуля, заворачивает код в определение основной функции, а затем анализирует и вызывает синтезированную функцию для инициализации модуля и его соединений с другими модулями. Объявления в области видимости модуля становятся локальными переменными синтезированной функции, и перехват управления системой становится доступным через параметры функции, значения которых задаются загрузчиком. Параметр require – это функция, которая синхронно выполняет контекстуализированный процесс загрузки для запрашиваемого модуля и возвращает значение exports. По умолчанию значение exports – это объект, заданный загрузчиком. Код модуля экспортирует эначения, создавая свойства для объекта exports. Это динамический процесс во время исполнения. Имена модулей, фактическое значение exports и имена и значения его свойств – все могут генерироваться динамически. Это усложняет и иногда делает невозможным предварительно определить необходимые модули приложения и какие сущности будут ими разделяться.

Одно из ранних применений модули CommonJS нашли в Node.js, которая разрабатывалась Райаном Далем в начале 2009 года. Node.js зародилась как платформа на основе JavaScript с открытым исходным кодом для построения серверных приложений, которые способны обрабатывать большое количество одновременных клиентских соединений. Node.js обеспечивала среду программирования на JavaScript библиотеками, дающими возможность использования глубокой асинхронной модели ввода-вывода. Node.js сочетала в себе общие интерфейсы POSIX с обратными вызовами JavaScript и упрощенную версию событийного цикла браузера. Реализация Node.js состояла из машины JavaScript Google’s V8 в обертке для автономного использования, загрузчика модуля CommonJS и набора модулей, реализованных на языке Си, обеспечивающих неблокирующие версии APIs POSIX, и других высокоуровневых файловых и сетевых операций. Первая публичная версия была выпущена в мае 2009 года, но она привлекла существенное внимание только после презентации Райана Даля в ноябре 2009 года. После этого Node.js получила дальнейшее развитие.

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

16

фективной машиной V8 были сравнимы по возможностям и часто превосходили по эффективности другие динамические языки для создания приложений, такие как Python и Ruby. Она стала де-факто стандартным способом написания консольных приложений на языке программирования JavaScript. Node.js дала возможность веб-программистам, которые владели JavaScript, применить свои навыки для создания других типов приложений и в средах без использования браузеров. Изначально разработчики клиентских веб-приложений программировали на языке JavaScript, потому что у них не было альтернативы. Теперь многие разработчики выбирают использование этого языка, потому что предпочитают программировать на JavaScript!

17

2. Лабораторный практикум

На практических занятиях студенты готовятся к выполнению лабораторных работ. Для успешного выполнения заданий рекомендуется предварительно ознакомиться с теоретическими сведениями из раздела 1.

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

2.1. Лабораторная работа и практическое занятие № 1. Введение в разработку на JavaScript

Необходимые инструменты для разработки

Visual Studio Code

Cуществует множество редакторов и интегрированных сред разработки – Integrated Development Environment (IDE) – для програм-

мирования на языке JavaScript, удобно использовать для выполнения заданий лабораторного практикума редактор Visual Studio Code (VS Code), так как он имеет множество полезных функций и встроенные средства отладки. В то же время разрешается использовать любые другие инструменты, которые позволяют выполнить все задания в полном объеме. Загрузить бесплатно установочный файл редактора для своей операционной системы можно с официального сайта VS Code [3].

Node.JS

Node.js – это программная платформа, основанная на движке V8 (транслирующем JavaScript в машинный код), превращающая JavaScript из узкоспециализированного языка в язык общего назначения. Node.js добавляет возможность JavaScript взаимодействовать с устройствами ввода-вывода через свой API (написанный на C++), подключать другие внешние библиотеки, написанные на разных языках, обеспечивая вызовы к ним из JavaScript-кода. Node.js применяется преимущественно на сервере, в качестве веб-сервера, но есть возможность разрабатывать на Node.js и десктопные оконные приложения и даже программировать микроконтроллеры [4]. Загрузить бесплатно установочный файл для своей операционной системы можно с официального сайта Node.js [5].

18

Работа в редакторе кода

Советы по оформлению кода можно найти в [2]. Важным этапом разработки программы является отладка кода. Отладка – этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки. Для того чтобы понять, где возникла ошибка, нужно узнать текущие значения переменных, выяснить, по какому пути выполнялась программа.

ВVS Code есть встроенный функциональный отладчик, перейти

ккоторому можно нажатием на иконку с жуком в левом меню или с помощью горячей клавиши «F5». Установка точек остановки происходит с помощью щелчка по пустому месту слева от номера строки кода. Появляющийся красный кружок является индикатором точки остановки. Подробное руководство по отладке программ в VS Code размещено на официальном сайте [3].

Также при разработке программ необходимо осуществлять ввод и вывод данных и запускать приложение. Далее рассматривается получение данных с клавиатуры и вывод их в консоль, а также запуск приложения Node.js. Для выполнения заданий лабораторного практикума следует создать директорию, в которой будут размещены файлы, соответствующие этим заданиям. Затем в VS Code нужно выбрать пункт меню «Файл», затем пункт «Открыть папку» и выбрать папку, соответствующую выполняемой работе.

Для запуска консольных приложений Node.js используется одноименная команда node.

Сначала необходимо сохранить разрабатываемый код в файл с расширением .js, а затем открыть терминал. В VS Code это осуществляется с помощью сочетания клавиш «Ctrl» + «~». Затем нужно ввести команду: node имя_файла.

Для вывода данных используется метод console.log.

Для ввода данных с клавиатуры используется следующий код, результат его запуска продемонстрирован на рис. 1.

var readline = require('readline'); var rl = readline.createInterface({

input: process.stdin, output: process.stdout

});

var a, b;

rl.question('Введите что-то: ', function (str) { console.log('Вы ввели: ' + str);

rl.close();

});

19

Рис. 1. Результат работы программы

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

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

var readline = require('readline'); var rl = readline.createInterface({

input: process.stdin, output: process.stdout

});

var a, b;

rl.question('Введите что-то 1: ', function (str1) { rl.question('Введите что-то 2: ', function (str2) {

console.log(str1, str2); rl.close();

});

});

Практические задания

1. Работа с переменными:

объявите переменные admin и name;

запишите в name строку ваше имя, например: «Василий»;

20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]