--- title: Object slug: Web/JavaScript/Reference/Global_Objects/Object tags: - Constructor - JavaScript - NeedsTranslation - Object - TopicStub translation_of: Web/JavaScript/Reference/Global_Objects/Object ---
Клас Object
відображає один з типів даних JavaScript. Він використовується для збереження різноманітних колекцій, що використовують ключі, та більш складних сутностей. Об'єкти можуть бути створені за допомогою конструктора {{jsxref("Object/Object", "Object()")}} або об'єктного ініціалізатора / літерального синтаксису.
Майже усі об'єкти у JavaScript є екземплярами {{jsxref("Object")}}; типовий об'єкт успадковує властивості (в тому числі методи) від Object.prototype
, хоча ці властивості можуть бути перекриті (перевизначені). Однак, можна навмисно створити Object, для якого це буде не так (наприклад, за допомогою {{jsxref("Object.create", "Object.create(null)")}}), або змінити його таким чином (наприклад, через {{jsxref("Object.setPrototypeOf")}}).
Зміни у прототипі Object
видимі усім об'єктам через ланцюжок прототипів, якщо властивості та методи, яких стосуються ці зміни, не були перевизначені далі у ланцюжку прототипів. Це надає дуже потужний, хоча й потенційно небезпечний, механізм для перевизначення або розширення поведінки об'єкта.
Конструктор Object
створює обгортку об'єкта для заданого значення.
Під час виклику не у контексті конструктора, Object
поводиться ідентично до new Object()
.
Дивіться також Ініціалізатор об'єктів / літеральний синтаксис.
У самому об'єкті не існує методів для видалення своїх властивостей (таких, як {{jsxref("Map.prototype.delete", "Map.prototype.delete()")}}). Щоб зробити це, необхідно скористатись оператором delete.
Object
. Це обгортка для наданого значення.[key, value]
особистих перелічуваних рядкових властивостей данного об'єкта.[[Prototype]]
об'єкта).Object
з типами undefined
та null
Наступні приклади зберігають порожній об'єкт Object
в o
:
var o = new Object();
var o = new Object(undefined);
var o = new Object(null);
Object
для створення об'єктів Boolean
Наступні приклади зберігають об'єкти {{jsxref("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();
Специфікація |
---|
{{SpecName('ESDraft', '#sec-object-objects', 'Object')}} |
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
{{Compat("javascript.builtins.Object")}}