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

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

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

Таблица 11. Варианты объектов для заданий 3 - 5

Вариант 1. Жираф и окапи

Вариант 2. Домашняя лошадь и

 

 

лошадь Пржевальского

3

let giraffe = {

let horse = {

 

herbivore: true,

herbivore: true,

 

age: undefined,

age: undefined,

 

presence: null,

presence: false,

 

vertebrae: 7,

year: 1758,

 

family: 'giraffidae',

species: 'Equus ferus',

 

};

};

 

let okapi = {

let przewalskisHorse = {

 

herbivore: true,

herbivore: true,

 

age: undefined,

age: undefined,

 

presence: false,

presence: null,

 

vertebrae: 7,

year: 1881,

 

family: 'giraffidae',

species: 'Equus ferus',

 

};

};

4

let giraffe = {

let horse = {

 

...

...

 

designation: {

designation: {

 

genus: 'giraffa',

subspecies:

 

year: 1762,

'E.f.caballus',

 

},

chromosomes: 64,

 

};

},

 

let okapi = {

};

 

...

let przewalskisHorse = {

 

designation: {

...

 

genus: 'okapia',

designation: {

 

year: 1901,

subspecies:

 

},

'E.f.przewalskii',

 

};

chromosomes: 66,

 

 

},

 

 

};

5

let giraffe = {

let horse = {

 

...

...

 

options: [5, 1000],

options: [1.75, 650],

 

};

};

 

let okapi = {

let przewalskisHorse = {

 

...

...

 

options: [1.5, 300],

options: [1.3, 300],

 

};

};

7.Даны объекты (табл. 12). Поместить эти объекты в соответствующую иерархию с помощью прототипов.

8.Реализовать задание 7, используя классы. Пример:

class Animal { gender =''; constructor() {

this.setGenderMale();

}

setGenderMale() {

61

this.gender = 'male';

}

}

class Cat extend Animal { type = ''; constructor(){

super(); // Конструктор не обязателен

}

}

const MyCat = new Cat(); console.log('MyCat:', MyCat);

Таблица 12. Варианты объектов для заданий 7

Вариант 1. Транспорт

Вариант 2. Драгоценные камни

let vehicle = {

let emerald = {

hasWheels: true,

carats: 0.48,

speed: 10,

};

};

let sapphire = {

let train = {

transparency: true,

speed: 25,

carats: 0.6,

};

};

let maglevTrain = {

let ruby = {

speed: 400,

carats: 0.6,

};

};

let boat = {

let pearl = {

hasWheels: false,

transparency: false,

};

};

Вариант 3. Деревья

Вариант 4. Планеты

let pineTree = {

let planetEarth = {

pinopsida: true,

satellites: 1,

height: 50,

};

};

let planetMars = {

let birchTree = {

satellites: 2,

pinopsida: false,

};

};

let planetSaturn = {

let cedar = {

hasRings: true,

height: 40,

satellites: 62,

};

};

let oak = {

let planetVenus = {

height: 60,

hasRings: false,

};

};

2.6. Лабораторная работа и практическое занятие № 6. NodeJS и работа с файловой системой

Node.js реализует ввод/вывод файлов с использованием простых оболочек для стандартных функций POSIX. Модуль Node.js FS (File System) не нуждается в предварительной установке перед использованием и может быть импортирован с помощью следующего синтаксиса:

62

const fs = require('fs');

Синхронные и асинхронные методы

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

Асинхронные методы принимают в качестве последнего параметра функции обратного вызова завершения и в качестве первого параметра функции обратного вызова ошибки.

Например, исследуем метод fs.rename(). Асинхронная версия метода использует функцию обратного вызова:

const fs = require('fs'); fs.rename('before.json', 'after.json', (err) => {

if (err) {

return console.error(err)

}

})

При использовании его синхронной версии для обработки ошибок используется конструкция try/catch:

const fs = require('fs'); try {

fs.renameSync('before.json', 'after.json')

}catch (err) { console.error(err) }

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

 

Методы для работы с директориями

 

Рассмотрим

некоторые методы для работы с директориями

(табл. 13).

 

 

Таблица 13. Методы для работы с директориями

Метод

Назначение

 

п/п

 

 

 

1

fs.access()

Проверка существования директории и возмож-

 

 

 

ности доступа к ней с учетом разрешений

 

2

fs.mkdir()

Создание новой директории

 

3

fs.readdir()

Чтение директории

 

4

fs.rename()

Переименование директории

 

5

fs.rmdir()

Удаление директории

 

63

Пример создания новой директории с помощью синхронного метода fs.mkdir():

const fs = require('fs');

const folderName = '/Users/userPC/test' try {

if (!fs.existsSync(dir)){ fs.mkdirSync(dir)

}

}catch (err) { console.error(err) }

Методы для работы с файлами

Получение информации о файле

Для получения системной информации о файле применяются функции fs.statSync()/fs.stat():

fs.statSync('name');

fs.stat('name', function(error,stats){ });

Параметры:

'name' – строка с именем файла, включая путь к нему; function(error,stats){ } – функция обратного вызова, которая вы-

полняется после завершения чтения, где error – параметр, который хранит информацию об ошибке при наличии; stats – объект типа fs.Stats.

Объект типа fs.Stats содержит данные:

dev – номер устройства (это может быть полезным, если у вас несколько разделов или физических дисков);

mode – содержит много информации, включая тип элемента (файл/директория/символьная ссылка) и права доступа;

uid – идентификатор владельца элемента;

gid – идентификатор группы владельца;

size – размер в байтах;

atime, mtime и ctime – время последнего доступа, изменения и создания элемента.

Кроме того, в классе fs.Stats содержится несколько важных методов, которые можно использовать для проверки типа файла:

stats.isFile() — возвращает true, если тип файла — простой

файл;

stats.isDirectory() — возвращает true, если тип файла — ката-

лог;

stats.isBlockDevice() — возвращает true, если тип файла — блочное устройство;

stats.isCharacterDevice() — возвращает true, если тип файла — символьное устройство;

64

stats.isSymbolicLink() — возвращает true, если тип файла — символьная ссылка;

stats.isFIFO() — возвращает true, если тип файла — FIFO;

stats.isSocket() — возвращает true, если тип файла — сокет. Например:

const fs = require('fs'); fs.stat('textFile.txt', (err, stats) => {

if (err) { console.error(err) return

}

stats.isFile() //true stats.isDirectory() //false stats.isSymbolicLink() //false stats.size //1024000 //= 1MB

})

Создание/открытие файла

Для создания и (или) открытия файла применяются функции fs.openSync()/fs.open():

fs.openSync('name', flag);

fs.open('name', flag, function(error,fd){ });

Параметры:

'name' – строка с именем файла, включая путь к нему;

flag – флаг, указывающий режим работы с файлом (права доступа к нему). По умолчанию – чтение и запись;

function(error,fd){ } – функция обратного вызова, которая выполняется после завершения чтения, где error – параметр, который хранит информацию об ошибке при наличии; fd – дескриптор файла.

Флаги для операций чтения/записи: r – открыть файл для чтения;

r+ – открыть файл для чтения и записи;

rs – открыть файл для чтения в синхронном режиме;

rs+ – открыть файл для чтения и записи в синхронном режиме; w – открыть файл для записи;

wx – работает как «w», но не выполняется, если путь существу-

ет;

w+ – открыть файл для чтения и записи;

wx+ – работает как «w+», но не выполняется, если путь существует;

a – открыть файл для дополнения;

ax – работает как «а», но не выполняется, если путь существует; a+ – открыть файл для чтения и расширения;

65

ах+ – работает как «a+», но не выполняется, если путь существует.

Например:

const fs = require('fs'); // асинхронный вариант

fs.open('textFile.txt', r+, function(error,fd){ if(error) throw error; // если возникла ошибка console.log('Асинхронное открытие файла');

});

// синхронный вариант console.log('Синхронное открытие файла') let data = fs.openSync('textFile.txt', r+); console.log(data);

Результат:

C:\node\filesapp>node read.js

Синхронное открытие файла Асинхронное открытие файла

C:\node\filesapp>_

Чтение файла

Для чтения файла применяются функции fs.readFileSync()/fs.readFile():

fs.readFileSync('name', 'code'); fs.readFile('name', 'code', function(error,data){

});

Параметры:

'name' – путь к файлу относительно файла приложения app.js;

'code' – кодировка для получения текстового содержимого

файла;

– function(error,data){ } – функция обратного вызова, которая выполняется после завершения чтения, где error – параметр, который хранит информацию об ошибке при наличии; data – считанные данные.

Например:

const fs = require('fs'); // асинхронное чтение

fs.readFile('textFile.txt', 'utf8', function(error,data){

console.log('Асинхронное чтение файла'); if(error) throw error; // если возникла ошибка console.log(data); // выводим считанные данные

});

// синхронное чтение console.log('Синхронное чтение файла')

let data = fs.readFileSync('textFile.txt', 'utf8'); console.log(data);

66

Результат:

C:\node\filesapp>node read.js

Синхронное чтение файла

Hello

Асинхронное чтение файла

Hello C:\node\filesapp>_

Функция fs.readFile() вызывается первой, но ее результат выводится в самом конце, так как она асинхронная и не блокирует поток выполнения.

Запись в файл

Чтобы перезаписать содержимое файла, используются функции fs.writeFileSync()/fs.writeFile(), где в качестве первого аргумента при-

нимается имя файла, в качестве второго – данные, которые нужно записать в файл, а в качестве третьего (для асинхронного метода) – функция обратного вызова с параметром error.

fs.writeFileSync('name', 'new text'); fs.writeFile('name', 'new text', function(error){

});

Например:

const fs = require('fs');

// асинхронная запись fs.writeFile('textFile.txt', 'Hello', func-

tion(error){

if(error) throw error; // если возникла ошибка console.log('Асинхронная запись файла заверше-

на. Содержимое файла:');

let data = fs.readFileSync('textFile.txt',

'utf8');

console.log(data);

});

Результат:

C:\node\filesapp>node write.js

Асинхронная запись файла завершена. Содержимое файла:

Hello C:\node\filesapp>_

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

Если необходимо добавить данные в файл, то применяются функции fs.appendFileSync()/fs.appendFile(), где в качестве первого аргумента принимается имя файла, в качестве второго – данные, которые нужно добавить в конец файла, а в качестве третьего (для асинхронного метода) – функция обратного вызова с параметром error.

67

Например:

const fs = require('fs'); fs.appendFileSync('textFile.txt', ', world'); fs.appendFile('textFile.txt', '!!!', func-

tion(error){

if(error) throw error; // если возникла ошибка console.log('Запись файла завершена. Содержимое

файла:');

let data = fs.readFileSync('textFile.txt',

'utf8');

console.log(data);

});

Результат:

C:\node\filesapp>node write1.js

Запись файла завершена. Содержимое файла:

Hello, world!!! C:\node\filesapp>_

Копирование файла

Для копирования файла используются функции fs.copyFileSync()/fs.copyFile(), где в качестве первого аргумента при-

нимается имя копируемого файла, в качестве второго – имя нового файла, а в качестве третьего (для асинхронного метода) – функция обратного вызова с параметром error.

fs.copyFileSync('name', 'new name');

fs.copyFile(' name ', 'new name', function(error){

});

Например:

const fs = require('fs'); // асинхронное копирование

fs.copyFile('textFile.txt', 'newFile.txt', function(error){

if(error) throw error; // если возникла ошибка console.log('Файл textFile.txt успешно

скопирован в newFile.txt.');

});

// синхронное копирование fs.copyFileSync('textFile.txt', 'nextFile.txt'); console.log('Файл newFile.txt успешно скопирован в

nextFile.txt.');

Результат:

C:\node\filesapp>node copy.js

Файл textFile.txt успешно скопирован в nextFile.txt. Файл textFile.txt успешно скопирован в newFile.txt.

C:\node\filesapp>_

68

Переименование файла

Для переименования файла используются функции fs.renameSync()/fs.rename(), где в качестве первого аргумента принимается исходное имя файла, в качестве второго – новое имя файла, а в качестве третьего (для асинхронного метода) – функция обратного вызова с параметром error.

fs.renameSync('name', 'new name'); fs.rename('name', 'new name', function(error){ });

Например:

const fs = require('fs');

// асинхронное переименование fs.copyFile('newFile.txt', 'newFile1.txt', func-

tion(error){

if(error) throw error; // если возникла ошибка console.log('Файл newFile.txt успешно

переименован в newFile1.txt.');

});

// синхронное переименование fs.copyFileSync('nextFile.txt', 'nextFile1.txt'); console.log('Файл nextFile.txt успешно переименован

в nextFile1.txt.');

Результат:

C:\node\filesapp>node rename.js

Файл nextFile.txt успешно переименован в nextFile1.txt.

Файл newFile.txt успешно переименован в newFile1.txt.

C:\node\filesapp>_

Удаление файла

Для удаления файла используются функции fs.unlinkSync()/fs.unlink(), где в качестве первого аргумента принимается имя удаляемого файла, а в качестве второго (для асинхронного метода) – функция обратного вызова с параметром error.

fs.unlinkSync('name'); fs.unlink('name', function(error){ });

Например:

const fs = require('fs'); // асинхронное удаление

fs.unlink('newFile1.txt', function(error){ if(error) throw error; // если возникла ошибка console.log('Файл newFile1.txt успешно

удален.');

});

// синхронное удаление fs.unlinkSync('nextFile1.txt');

69

console.log('Файл nextFile1.txt успешно удален.');

Результат:

C:\node\filesapp>node delete.js

Файл nextFile1.txt успешно удален. Файл newFile1.txt успешно удален.

C:\node\filesapp>_

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

1.Создать файловую структуру следующего вида: files

hello.txt

peoples.json data

user.txt

2.Записать в файл «user.txt» данные о себе: ФИО, факультет, курс, № группы.

3.Переименовать файл «user.txt» в «aboutMe.txt».

4.Вывести содержимое файлов «aboutMe.txt» и «hello.txt».

5.Удалить файл «peoples.json».

6.Вывести следующие данные о файле «aboutMe.txt»: размер, дата создания, дата изменения.

7.Выполнить задания 1-6 с использованием асинхронных мето-

дов.

8.Добавить обработку ошибок ко всем операциям.

9.Реализовать функцию, которая получает на вход путь к jsonфайлу, следит за его состоянием и при каждом изменении выводит в консоль список ключей из этого файла.

Примечание. https://nodejs.org/docs/latest/api/fs.html.

2.7. Лабораторная работа и практическое занятие № 7. Модульная система NodeJS

Создание и подключение модулей

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

export.add = function(a,b) { return a + b;

}

export.multiply = function(a,b) { return a * b;

}

70

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