Як створювати об'єкти в js?
JavaScript надає низку методів для керування елементами на веб-сторінці. Зокрема, ми можемо створювати та додавати нові елементи або замінювати та видаляти вже наявні. Розглянемо ці способи.
Створення елементів
Для створення елементів об'єкт document має такі методи:
- createElement(elementName) : створює елемент html, тег якого передається як параметр. Повертає створений елемент
- createTextNode(text) : створює та повертає текстовий вузол. Як параметр передається текст вузла.
Створимо елемент за допомогою createElement :
const header = document.createElement("h1"); // створюємо заголовок console.log(header); //
Таким чином, змінна header зберігатиме посилання на елемент h1 .
Створимо текстовий вузол за допомогою createTextNode :
const headerText = document.createTextNode("Hello World"); // створюємо текстовий вузол console.log(headerText); // "Hello World"
Додавання елементів
Проте створення елементів недостатньо, їх ще треба додати на веб-сторінку.
Для додавання елементів ми можемо використовувати один із методів об'єкта Node:
- appendChild(newNode) : додає новий вузол newNode до кінця колекції дочірніх вузлів
- insertBefore(newNode, referenceNode) : додає новий вузол newNode перед вузлом referenceNode
appendChild
Використовуємо метод appendChild() :
const header = document.createElement("h1"); // створюємо заголовок const headerText = document.createTextNode("Hello World"); // створюємо текстовий вузол header.appendChild(headerText); // Додаємо в елемент h1 текстовий вузол console.log (header); // Hello World
І щоб додати створений елемент на сторінку, його треба додати до елемента, що вже є на сторінці:
METANIT.COM
Спочатку створюємо звичайний елемент заголовка h2 та текстовий вузол. Потім текстовий вузол додаємо елемент заголовка. Потім заголовок додаємо в елемент body:
Варто зазначити, що нам необов'язково для визначення тексту всередині елемента створювати додатковий текстовий вузол, тому що ми можемо скористатися властивістю textContent і безпосередньо привласнити текст:
const header = document.createElement("h1"); // створюємо заголовок header.textContent = "Hello World"; // Визначаємо текст елемента
У цьому випадку текстовий вузол буде створений неявно під час встановлення тексту.
insertBefore
Метод appendChild() додає елемент до кінця контейнера. Щоб конкретизувати місце для додавання, можна використовувати інший метод - insertBefore() , який додає один елемент перед іншим елементом. Наприклад, у нас є наступна сторінка:
METANIT.COM Text 1
Text 2
Припустимо, нам треба додати елемент body перед першим параграфом заголовок. Ми можемо це зробити так:
METANIT.COM Text 1
Text 2
Якщо нам потрібно вставити новий вузол на друге, третє або будь-яке інше місце, то нам треба знайти вузол, перед яким треба вставляти, за допомогою комбінацій властивостей firstElementChild/lastElementChild та nextSibling/previousSibling.
Копіювання елемента
Іноді елементи бувають досить складними за складом, і набагато простіше їх скопіювати, ніж за допомогою окремих викликів створювати вміст. Для копіювання вже наявних вузлів об'єкта Node можна використовувати метод cloneNode() :
METANIT.COM Home Page
Text 1
Text 2
У метод cloneNode() як параметр передається логічне значення: якщо передається true, то елемент копіюватиметься з усіма дочірніми вузлами; якщо передається false – то копіюється без дочірніх вузлів. Тобто в даному випадку ми копіюємо вузол з усім вмістом і потім додаємо в кінець елемента c .
Заміна елемента
Для заміни елемента застосовується метод replaceChild(newNode, oldNode) об'єкта Node. Цей метод як перший параметр приймає новий елемент, який замінює старий елемент oldNode, що передається як другий параметр.
METANIT.COM Home Page
Text 1
Text 2
У цьому випадку замінюємо перший елемент - перший параграф заголовком h2:
Видалення елемента
Для видалення елемента викликається метод removeChild() об'єкта Node. Цей метод видаляє один із дочірніх вузлів:
METANIT.COM Home Page
Text 1
Text 2
У цьому випадку видаляється перший параграф із блоку div
Видалення всіх елементів
Іноді виникає потреба видалити всі елементи. Для цього перебираємо всі елементи контейнера та видаляємо їх:
Home Page
Text 1
Text 2
Об'єкти в JavaScript
У цій статті ми розглянемо, що таке об'єкти, які у них властивості та методи, як створювати нові об'єкти, як успадковувати їх від інших об'єктів, як працювати з індексами, гетерами та сеттерами, а також як порівнювати та видаляти об'єкти.
Об'єкти JavaScript дозволяють зберігати та обробляти різні дані та функції, пов'язані з ними. Об'єкт – це колекція з ключа та його значення, де ключ – це рядок, а значення – це будь-який тип даних, наприклад:
У цьому прикладі ми створили об'єкт person, який має чотири властивості: name, age, hobbies і sayHello. Перші три властивості зберігають прості дані (рядок, число та масив), а четверта властивість зберігає функцію, яку ми можемо викликати як метод об'єкта. Для доступу до властивостей та методів об'єкта ми можемо використовувати точкову нотацію або квадратні дужки:
console.log(person.name); // "Alice" console.log(person["age"]); // 25 console.log(person.hobbies[0]); // "reading" console.log(person.sayHello()); // "Hello, I'm Alice"
Об'єкти та їх властивості
Властивості об'єкта – це змінні, що належать об'єкту. Вони можуть бути додані, змінені або видалені у будь-який час:
person.height = 170; // Додаємо нову властивість person.age = 26; // Змінюємо існуючу властивість delete person.hobbies; // Видаляємо властивість
Індекси властивостей об'єкту
Індекс властивості об'єкта — це рядок, який використовується для доступу до значення властивості.Індекси можуть бути будь-якими допустимими рядками JavaScript, включаючи порожні рядки. Однак не всі рядки є допустимими ідентифікаторами (іменами змінних), тому для них потрібно використовувати квадратні дужки замість точкової нотації, наприклад:
const obj = <>; obj.number = 477; obj[''] = 'empty'; // Порожній рядок obj['1'] = 'one'; // Рядок із цифри obj['hello world'] = 'greeting'; // Рядок із пробілом console.log(obj) // // Використання квадратних дужок console.log(obj['']); // empty console.log(obj['1']); // one console.log(obj['hello world']); // Greeting // Використання точкової нотації призводить до синтаксичної помилки console.log (obj.1); // SyntaxError console.log(obj.hello world); // SyntaxError
Як бачимо, щоб отримати доступ до властивостей з індексами, які не є допустимими ідентифікаторами, ми маємо використовувати квадратні дужки.
Як визначити існує потрібна властивість в об'єкті чи ні
Щоб визначити, чи існує властивість, використовуйте оператор in. Він повертає true, якщо об'єкт має властивість із заданим ім'ям, та false в іншому випадку. Також перевіряється, чи є властивість прототипу об'єкта.
const person = <name: 'Igor', age: 30, >; console.log('name' in person); // true console.log('height' in person); // false console.log('toString' in person); // true - успадковується від Object.prototype
Як перебрати властивості об'єкту
Цикл for ... in - це спосіб перебрати всі властивості об'єкта і виконати деяку дію для кожного з них:
for (var key in person) < console.log(key + ": " + person[key]); >// name: Alice // age: 26 // sayHello: function () < // console.log("Hello, I'm" + this.name); //>// height: 170
Упорядкування властивостей об'єкту
Властивості об'єкта JavaScript не мають певного порядку. Однак, при переборі властивостей об'єкта за допомогою циклу for…in або методу Object.keys, вони зазвичай виводяться в такому порядку: спочатку йдуть властивості з цілими індексами у зростаючому порядку, потім йдуть інші властивості в порядку їх створення.
const obj = <>; obj[2] = 'two'; obj[1] = 'one'; obj['name'] = 'Sveta'; obj[3] = 'tree'; obj['age'] = 23; for (var key in obj) < console.log(key + ':' + obj[key]); >// 1:one // 2:two // 3:tree // name:Sveta // age:23
Видалення властивостей
Щоб видалити властивості об'єкта або сам об'єкт, використовуйте оператор delete. Він видаляє властивість та його значення з об'єкта ↓
const person = <name: "Alice", age: 25, hobbies: ["reading", "dancing"] >; delete person.age; // Видаляємо властивість age console.log(person.age); // undefined delete person.hobbies[0]; // Видаляємо елемент масиву console.log(person.hobbies); //[undefined, “dancing”] delete person; // Видаляємо об'єкт console.log(person); // ReferenceError: person is not defined
Однак, якщо властивість має атрибут configurable: false, то воно не може бути видалено:
const obj = Object.create(<>, < x: < value: 10, writable: true, enumerable: true, configurable: false >>); console.log(obj.x); //10 delete obj.x; // не видаляє властивість x console.log(obj.x); // 10
Визначення властивостей типу об'єкта
Тип об'єкта - це класифікація об'єктів за їхньою внутрішньою структурою та поведінкою. JavaScript має вбудовані типи об'єктів, такі як Array, Date, Function, Math та інші, а також типи об'єктів, які ми можемо створювати за допомогою функцій конструкторів або методу Object.create. Кожен тип об'єкта має власні властивості та методи, які доступні для всіх його екземплярів, наприклад:
const arr = [1, 2, 3]; // Створюємо масив - екземпляр типу Array console.log(arr.length); // 3 - властивість length визначено типу Array console.log(arr.push(4)); // 4 - метод push визначений типу Array const date = new Date(); // Створюємо дату - екземпляр типу Date console.log(date.getFullYear()); // 2023 - метод getFullYear визначений типу Date console.log(date.getTimezoneOffset()); // -180 - метод getTimezoneOffset визначено типу Date const func = function () < >; // Створюємо функцію – екземпляр типу Function console.log(func.name); // "" - властивість name визначено типу Function console.log(func.call()); // undefined - метод call визначений типу Function
Щоб визначити властивості об'єкта, можна використовувати його прототип. Властивості прототипу є спільними для кожного екземпляра даного типу. Властивість prototype характерно для кожного типу об'єкта:
function Animal(name, type) < this.name = name; this.type = type; >Animal.prototype.makeSound = function () < console.log(this.name + "says" + this.type); >; const dog = new Animal("Rex", "woof"); const cat = new Animal("Tom", "meow"); dog.makeSound(); // Rex says woof cat.makeSound(); // Tom says meow
Ми визначили метод makeSound для Animal через його зразок. Тепер усі екземпляри цього можуть застосовувати цей метод. Це заощаджує пам'ять і уникає дублювання коду.
Створення нових об'єктів
Існує кілька способів створення нових об'єктів у JavaScript ↓
- Використання ініціалізаторів об'єкту. Ініціалізатором називається літерал, який визначає властивості та методи об'єкта. Це найпростіший і найзручніший метод створення об'єктів. Наприклад:
- Застосування функції архітектора. Функція конструктора – це спеціальна функція, яка створює новий об'єкт під час виклику з оператором new. Вона має ім'я з великої літери та приймає параметри для ініціалізації властивостей об'єкта. Всередині функції конструктора ми маємо право використовувати слово this для посилання на об'єкт, що ініціалізується:
function Animal(name, type) < this.name = name; this.type = type; this.makeSound = function () < console.log(this.name + 'says' + this.type); >; > const dog = new Animal('Rex', 'woof'); const cat = new Animal('Tom', 'meow');
- Використання методу Object.create. Метод Object.create - Це сучасний спосіб створення об'єктів, який дозволяє успадковувати їх від інших об'єктів. Він приймає два параметри: прототип об'єкта, від якого ми хочемо успадкувати, та дескриптори властивостей, які ми хочемо додати або перевизначити:
const person = < name: 'Alice', age: 25, sayHello: function () < console.log("Hello, I'm " + this.name); >, >; const student = Object.create(person, < grade: < value: 10, writable: true, enumerable: true, configurable: true >, study: < value: function () < console.log(this.name + ' is studying '); >, writable: true, enumerable: true, configurable: true, >, >);
У цьому прикладі ми створили об'єкт student, який успадковує всі властивості та методи від об'єкта person, а також додали дві нові властивості: grade і study. Дескриптори властивостей дозволяють встановити різні атрибути властивостей, такі як можливість запису, перерахування та конфігурації.
Порівняння об'єктів
- Для порівняння об'єктів ми можемо використовувати оператори == та ===. Однак вони не порівнюють об'єкти за їх змістом, а лише за їх посиланнями. Тобто, два об'єкти рівні лише тоді, коли вони посилаються на той самий об'єкт у пам'яті:
var person1 =; var person2 =; var person3 = person1; console.log(person1 == person2); // false console.log(person1 === person2); // false console.log(person1 == person3); // true console.log(person1 === person3); // true
Об'єкти person1 і person2, хоча мають однакові властивості, не рівні одне одному, оскільки вони є різними об'єктами у пам'яті. А об'єкт person3 дорівнює об'єкту person1тому що він посилається на нього.
- Для порівняння об'єктів за їх змістом ми можемо застосовувати спеціальні функції, які рекурсивно перевіряють всі властивості об'єктів на рівність, наприклад:
function isEqual(obj1, obj2) < if (obj1 === obj2) return true; // якщо посилання дорівнюють, то об'єкти дорівнюють if (typeof obj1 !== 'object' || typeof obj2 !== 'object') return false; // якщо один із аргументів не об'єкт, то об'єкти не рівні const keys1 = Object.keys(obj1); // Отримуємо масив ключів першого об'єкта const keys2 = Object.keys(obj2); // Отримуємо масив ключів другого об'єкта if (keys1.length !== keys2.length) return false; // якщо довжини масивів ключів не дорівнюють, то об'єкти не дорівнюють for (var key of keys1) < // перебираємо всі ключі першого об'єкта if (!obj2.hasOwnProperty(key)) return false; // якщо другий об'єкт немає такого ключа, то об'єкти не рівні if (!isEqual(obj1[key], obj2[key])) return false; // якщо значення ключа не рівні, то об'єкти не рівні (рекурсивний виклик) >return true; // якщо всі перевірки пройдені, об'єкти рівні > var person1 = < name: 'Alice', age: 25, hobbies: ['reading', 'dancing'] >; var person2 = < name: 'Alice', age: 25, hobbies: ['reading', 'dancing'] >; var person3 = person1; console.log(isEqual(person1, person2)); // true console.log(isEqual(person1, person3)); // true
У цій функції ми порівнюємо два об'єкти за їх ключами та значеннями, використовуючи рекурсію для вкладених об'єктів.
успадкування
Спадкування – це механізм, який дозволяє одному об'єкту отримувати властивості та методи від іншого об'єкта. Це потрібно для того, щоб використовувати код ще раз і при цьому максимально уникнути дублювання. У JavaScript успадкування ґрунтується на прототипах, тобто на спеціальних об'єктах, які є прабатьками інших об'єктів. Всі об'єкти мають властивість [[Prototype]], що посилається на його прототип. Коли ми намагаємося отримати доступ до властивості або методу об'єкта, який у нього немає, JavaScript шукає його в прототипі.Якщо його там не знайдено, то пошук триває ланцюжком прототипів до найвищого рівня — до об'єкта Object.prototypeщо є прототипом всіх об'єктів. Давайте розглянемо на прикладі:
const person = < name: 'Alice', age: 25, sayHello: function () < console.log("Hello, I'm " + this.name); >, >; const student = Object.create(person); student.grade = 10; student.study = function() < console.log(this.name + 'is studying'); >; student.sayHello(); // Hello, I'm Alice student.study(); // Alice is studying console.log(student.age); // 25 console.log(student.hasOwnProperty('name')); // false console.log(student.hasOwnProperty('grade')); // true
Об'єкт student успадковує властивості та методи від об'єкта person через його прототип. Він також має власні властивості grade і Студія. Метод hasOwnProperty дозволяє перевірити, чи є властивість власною або успадкованою.
Визначення методів
Метод – це функція, яка належить об'єкту і може використовувати його дані через ключове слово this. Методи можуть бути визначені як:
const person = < name: "Alice", age: 25, sayHello: function () < console.log("Hello, I'm " + this.name); >>; person.sayHello(); // Hello, I'm Alice
function Animal(name, type) < this.name = name; this.type = type; >Animal.prototype.makeSound = function () < console.log(this.name + "says" + this.type); >; const dog = new Animal("Rex", "woof"); dog.makeSound(); // Rex says woof
У цих прикладах бачимо два способи визначення методів: як властивість об'єкта person і як властивість прототипу типу Animal.
Використання цього посилання на об'єкт
Ключове слово this JavaScript використовується для посилання на поточний об'єкт, у контексті якого виконується код. Значення this залежить від того, як і де викликається функція:
- Якщо функція викликається як метод об'єкта, то this посилається на цей об'єкт:
const person = < name: "Alice", age: 25, sayHello: function () < console.log("Hello, I'm " + this.name); >>; person.sayHello(); // Hello, I'm Alice
Тут ми викликаємо функцію sayHello як метод об'єкта personтому this всередині функції посилається на об'єкт person.
- Однак, стрілочна функція всередині об'єкта не працюватиме з цим, а посилатиметься відразу на глобальний об'єкт (window у браузері або global в Node.js):
var lastName = 'Іваненко'; const person = < lastName: 'Dubova', age: 25, sayHello: () =>< console.log("Hello, I'm " + this.lastName); >, >; person.sayHello(); //Hello, I'm Ivanenko - виведе ім'я із глобальної області видимості
Важливо! У глобальну область видимості потрапляють змінні, оголошені за допомогою var. Змінні, оголошені за допомогою let і const будуть видавати Hello, I'm undefined.
