Object
Ця особливість є добре створеною і роботою, пов'язаною з багатьма пристроями і розробниками версій. It's been available across browsers since July 2015 .
Тип Object представляє один із типів даних JavaScript. Він використовується для зберігання різних колекцій з ключами та більш складних сутностей. Об'єкти можуть бути створені за допомогою конструктора Object() або синтаксису ініціалізатора/літералу об'єкта.
Опис
Майже всі об'єкти JavaScript є екземплярами Object ; Типовий об'єкт успадковує властивості (включаючи методи) від Object.prototype, хоча ці властивості можуть бути затінені (тобто перевизначені). Єдині об'єкти, які не успадковують від Object.prototype, - це ті, у яких прототип null, або які походять від інших об'єктів з прототипом null.
Зміни в об'єкті Object.prototype видно всім об'єктам за допомогою ланцюжка прототипів, якщо властивості та методи, схильні до цих змін, не перевизначені далі по ланцюжку прототипів. Це надає дуже потужний, хоч і потенційно небезпечний механізм для перевизначення або розширення поведінки об'єктів. Для забезпечення більшої безпеки, Object.prototype – єдиний об'єкт в основному мові JavaScript, у якого незмінний прототип – прототип Object.prototype завжди null і не може бути змінений.
Синтаксис
// Ініціалізатор об'єкта або літерал <[ nameValuePair1[, nameValuePair2[, . nameValuePairN] ] ] >// Виклик як конструктор new Object([value])
Параметри
Пари з імен (рядки) та значень (будь-які значення), де ім'я відокремлюється від значення двокрапкою.
Властивості конструктора Object
Дозволяє додавати властивості до всіх об'єктів типу Object.
Методи конструктора Object
Створює новий об'єкт шляхом копіювання значень всіх власних перерахованих властивостей з однієї або більше вихідних об'єктів цільової об'єкт.
Створює новий об'єкт із зазначеними об'єктом прототипу та властивостями.
Додає до об'єкта іменовану властивість, що описується переданим дескриптором.
Додає до об'єкта іменовані властивості, що описуються переданими дескрипторами.
Заморожує об'єкт: інший код не зможе видалити або змінити властивість.
Повертає дескриптор якості для іменованої якості об'єкта.
Повертає масив, що містить імена всіх переданих об'єкту власних перелічуваних і неперелічуваних властивостей.
Повертає масив усіх символьних властивостей, знайдених у переданому об'єкті.
Повертає прототип вказаного об'єкта.
Визначає, чи є два значення помітними (тобто однаковими)
Визначає, чи дозволено розширення об'єкта.
Визначає, чи об'єкт був заморожений.
Визначає, чи об'єкт є запечатаним (sealed).
Повертає масив, що містить імена всіх власних перерахованих властивостей переданого об'єкта.
Асинхронно спостерігає за змінами об'єкта.
Запобігає будь-якому розширенню об'єкта.
Запобігає видаленню властивостей об'єкта іншим кодом.
Встановлює прототип (тобто внутрішня властивість [[Prototype]] )
Примірники та прототип об'єкта Object
Усі об'єкти в JavaScript є нащадками Object; всі об'єкти успадковують методи та властивості з прототипу об'єкта Object.prototype, хоча вони можуть бути перевизначені. Наприклад, прототипи інших конструкторів перевизначають властивість конструктора і надають власні методи toString() . Зміни в об'єкті прототипу Object поширюються на всі об'єкти до тих пір, поки властивості та методи, що враховують ці зміни, не перевизначаються далі ланцюжком прототипів.
Властивості
Перетворює вхідні дані на об'єкт.
Вказує на функцію, яка створює прототип об'єкта.
Вказує на об'єкт, який використовувався як прототип під час створення екземпляра об'єкта.
Методи
Зв'язує функцію з властивістю, яка при зверненні до нього виконує цю функцію і повертає її значення, що повертається.
Зв'язує функцію з властивістю, яка виконує при встановленні ту функцію, яка змінює властивість.
Повертає функцію, прив'язану як засіб отримання до зазначеної властивості.
Повертає функцію, прив'язану як установник до зазначеної властивості.
Повертає логічне значення, що вказує, чи містить об'єкт зазначену властивість як пряму властивість цього об'єкта, а не успадковану через ланцюжок прототипів.
Повертає логічне значення, що вказує, чи об'єкт, у якого викликаний метод, входить у ланцюжок прототипів іншого об'єкта.
Повертає логічне значення, що вказує, чи є властивість об'єкта enumerable own.
Повертає рядкову виставу об'єкта.
Повертає примітивне значення вказаного об'єкта.
Приклади
Приклад: використання Object з типами undefined та null
Наступні приклади зберігають порожній об'єкт Object змінну o :
const o = new Object(); const o = new Object(undefined); const o = new Object(null);
Приклад: використання Object для створення об'єктів Boolean
Наступний приклад зберігає об'єкти Boolean у змінну o:
// еквівалентно o = new Boolean (true); const o = new Object(true);
// Еквівалентно o = new Boolean (false); const o = new Object(Boolean());
Специфікації
Сумісність із браузерами
BCD tables only load in the browser
Дивіться також
Об'єкти в 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.
