Object

Клас Object відображає один з типів даних JavaScript. Він використовується для збереження різноманітних колекцій, що використовують ключі, та більш складних сутностей. Об'єкти можуть бути створені за допомогою конструктора Object() або об'єктного ініціалізатора / літерального синтаксису.

Опис

Майже усі об'єкти у JavaScript є екземплярами Object; типовий об'єкт успадковує властивості (в тому числі методи) від Object.prototype, хоча ці властивості можуть бути перекриті (перевизначені). Однак, можна навмисно створити Object, для якого це буде не так (наприклад, за допомогою Object.create(null)), або змінити його таким чином (наприклад, через Object.setPrototypeOf).

Зміни у прототипі Object видимі усім об'єктам через ланцюжок прототипів, якщо властивості та методи, яких стосуються ці зміни, не були перевизначені далі у ланцюжку прототипів. Це надає дуже потужний, хоча й потенційно небезпечний, механізм для перевизначення або розширення поведінки об'єкта.

Конструктор Object створює обгортку об'єкта для заданого значення.

  • Якщо значенням є null або undefined, конструктор створить та поверне порожній об'єкт.
  • В іншому випадку, він поверне об'єкт того типу, який відповідає наданому значенню.
  • Якщо значення вже є об'єктом, конструктор поверне це значення.

Під час виклику не у контексті конструктора, Object поводиться ідентично до new Object().

Дивіться також Ініціалізатор об'єктів / літеральний синтаксис.

Видалення властивості об'єкта

У самому об'єкті не існує методів для видалення своїх властивостей (таких, як Map.prototype.delete() (en-US)). Щоб зробити це, необхідно скористатись оператором delete.

Конструктор

Object()
Створює новий об'єкт Object. Це обгортка для наданого значення.

Статичні методи

Object.assign()
Копіює значення усіх перелічуваних особистих властивостей з одного або більше об'єктів у цільовий об'єкт.
Object.create()
Створює новий об'єкт із вказаним прототипним об'єктом і властивостями.
Object.defineProperty()
Додає зазначену властивість, описану наданим дескриптором, до об'єкта.
Object.defineProperties()
Додає зазначені властивості, описані наданими дескрипторами, до об'єкта.
Object.entries()
Повертає масив, що містить усі пари [key, value] особистих перелічуваних рядкових властивостей данного  об'єкта.
Object.freeze()
Заморожує об'єкт: інший код не може видаляти або змінювати будь-які властивості.
Object.fromEntries()
Повертає новий об'єкт з ітерабельного об'єкта, що містить пари ключ-значення (зворотний до Object.entries).
Object.getOwnPropertyDescriptor()
Повертає дескриптор властивості для зазначенної властивості об'єкта.
Object.getOwnPropertyDescriptors()
Повертає об'єкт, що містить дескриптори всіх особистих властивостей об'єкта.
Object.getOwnPropertyNames()
Повертає масив, що містить імена всіх особистих перелічуваних і неперелічуванних властивостей даного об'єкта.
Object.getOwnPropertySymbols()
Повертає масив усіх символьних властивостей, знайдених безпосередньо на даному об'єкті.
Object.getPrototypeOf()
Повертає прототип вказаного об'єкта.
Object.is()
Перевіряє, чи мають два аргументи однакове значення. Прирівнює усі значення NaN (що відрізняється як від абстрактної рівності, так і від строгої рівності).
Object.isExtensible()
Визначає, чи дозволене розширення об'єкта.
Object.isFrozen()
Визначає, чи є об'єкт замороженим.
Object.isSealed()
Визначає, чи є об'єкт запечатанним.
Object.keys()
Повертає масив, що містить імена всіх особистих перелічуваних рядкових властивостей даного об'єкта.
Object.preventExtensions()
Запобігає будь-яким розширенням об'єкта.
Object.seal()
Запобігає можливості іншого коду видаляти властивості об'єкта.
Object.setPrototypeOf()
Встановлює прототип (тобто, внутрішню властивість [[Prototype]] об'єкта).
Object.values()
Повертає масив, який містить значення, що відповідають усім особистим перелічуваним рядковим властивостям даного об'єкта.

Властивості екземплярів 

Object.prototype.constructor
Визначає функцію, що створює прототип об'єкта.
Object.prototype.__proto__
Вказує на об'єкт, що був використаний як прототип, коли створювався екземпляр об'єкта.
Object.prototype.__noSuchMethod__
Дозволяє визначити функцію, яка буде виконуватись, коли на об'єкті викликатиметься неіснуючий елемент.

Методи екземплярів

Object.prototype.__defineGetter__()
Прив'язує функцію до властивості, яка, під час звернення до неї, викликатиме цю функцію та повертатиме значення, яке повернула функція.
Object.prototype.__defineSetter__()
Прив'язує функцію до властивості, яка, під час присвоєння, виконує цю функцію, яка змінює властивість.
Object.prototype.__lookupGetter__()
Повертає функцію, прив'язану до вказаної властивості методом __defineGetter__().
Object.prototype.__lookupSetter__()
Повертає функцію, прив'язану до вказаної властивості методом __defineSetter__().
Object.prototype.hasOwnProperty()
Повертає булеве значення, що вказує, чи об'єкт містить вказану властивість як особисту властивість цього об'єкта, а не успадковану через ланцюжок прототипів.
Object.prototype.isPrototypeOf()
Повертає булеве значення, що вказує, чи присутній об'єкт, на якому викликається цей метод, у ланцюжку прототипів вказаного об'єкта.
Object.prototype.propertyIsEnumerable()
Повертає булеве значення, що вказує, чи встановлений внутрішній атрибут ECMAScript [[Enumerable]].
Object.prototype.toLocaleString()
Викликає toString().
Object.prototype.toString()
Повертає рядок, що відображає об'єкт.
Object.prototype.unwatch()
Прибирає точку спостереження з властивості об'єкта.
Object.prototype.valueOf()
Повертає просту величину вказаного об'єкта.
Object.prototype.watch() This API has not been standardized.
Додає точку спостереження до властивості об'єкта.

Приклади

Використання Object з типами undefined та null

Наступні приклади зберігають порожній об'єкт Object в o:

var o = new Object();
var o = new Object(undefined);
var o = new Object(null);

Використання Object для створення об'єктів Boolean

Наступні приклади зберігають об'єкти Boolean у o:

// еквівалентно до o = new Boolean(true);
var o = new Object(true);
// еквівалентно до o = new Boolean(false);
var o = new Object(Boolean());

Прототипи об'єктів

Змінюючи поведінку існуючих методів Object.prototype, розгляньте включення коду додаванням вашого розширення до чи після існуючої логіки. Наприклад, цей (неперевірений) код буде попередньо виконувати власну логіку перед тим, як буде виконано вбудовану логіку або інше розширення.

Коли викликається функція, аргументи виклику містяться у подібній до масиву "змінній" arguments. Наприклад, у виклику myFn(a, b, c), arguments, що знаходиться у тілі myFn, міститиме 3 подібні до масиву елементи, що відповідають (a, b, c).

Модифікуючи прототипи з хуками, просто передайте this та arguments (стан виклику) до поточної поведінки, викликавши apply() на функції. Цей шаблон може використовуватись для будь-яких прототипів, наприклад, Node.prototype, Function.prototype, і т. д.

var current = Object.prototype.valueOf;

// Оскільки моя властивість "-prop-value" є наскрізною та не завжди
// знаходиться в тому самому ланцюжку прототипів, я хочу змінити Object.prototype:
Object.prototype.valueOf = function() {
  if (this.hasOwnProperty('-prop-value')) {
    return this['-prop-value'];
  } else {
    // Це не схоже на один з моїх об'єктів, тому повернемось
    // до початкової поведінки, відтворивши поточну поведінку якнайкраще.
    // Метод apply поводиться як "super" у деяких інших мовах.
    // І хоча valueOf() не приймає аргументів, можливо, інший хук їх прийматиме.
    return current.apply(this, arguments);
  }
}

Оскільки JavaScript, насправді, не має об'єктів підкласу, прототип є зручним обхідним рішенням для створення об'єкта у ролі "базового класу" з певними функціями, що діють як об'єкти. Наприклад:

var Person = function(name) {
  this.name = name;
  this.canTalk = true;
};

Person.prototype.greet = function() {
  if (this.canTalk) {
    console.log('Привіт, я ' + this.name);
  }
};

var Employee = function(name, title) {
  Person.call(this, name);
  this.title = title;
};

Employee.prototype = Object.create(Person.prototype);

Employee.prototype.greet = function() {
  if (this.canTalk) {
    console.log('Привіт, я ' + this.name + ', ' + this.title);
  }
};

var Customer = function(name) {
  Person.call(this, name);
};

Customer.prototype = Object.create(Person.prototype);

var Mime = function(name) {
  Person.call(this, name);
  this.canTalk = false;
};

Mime.prototype = Object.create(Person.prototype);

var bob = new Employee('Боб', 'будівельник');
var joe = new Customer('Джо');
var rg = new Employee('Ред Грін', 'майстер на всі руки');
var mike = new Customer('Майк');
var mime = new Mime('Мім');

bob.greet();
// Привіт, я Боб, будівельник

joe.greet();
// Привіт, я Джо

rg.greet();
// Привіт, я Ред Грін, майстер на всі руки

mike.greet();
// Привіт, я Майк

mime.greet();

Специфікації

Специфікація
ECMAScript (ECMA-262)
The definition of 'Object' in that specification.

Сумісність з веб-переглядачами

BCD tables only load in the browser

Дивіться також