JS властивість Object.constructor


Загальний опис

У JavaScript кожен об'єкт має властивість, звану constructor, яка посилається на конструктор-функцію, що створила цей об'єкт. Для об'єктів, які були створені конструктором-функцією, наприклад, за допомогою ключового слова new, властивість constructor є корисним засобом для ідентифікації типу об'єкта та доступу до його конструктора.

Використання constructor від простих до складних випадків

  1. Основне використання: Якщо ви створите об'єкт за допомогою конструктора, можна використовувати властивість constructor, щоб з'ясувати, яка функція його створила.
function Car(model, year) {
    this.model = model;
    this.year = year;
}

const myCar = new Car("Tesla", 2022);

console.log(myCar.constructor === Car);  // виведе true
  1. Створення екземпляру за допомогою constructor: Можна використовувати constructor для створення нового екземпляра об'єкта без прямого звертання до конструктора.
const anotherCar = new myCar.constructor("Audi", 2023);
  1. Визначення типу об'єкта: Властивість constructor може бути корисною для визначення типу об'єкта, особливо коли стандартний метод typeof не дає достатньо інформації.
function Dog(name) {
    this.name = name;
}

const myDog = new Dog("Rex");

if (myDog.constructor === Dog) {
    console.log("Це справді собака!");
}

Важливі особливості та практичні рекомендації

  • Якщо ви модифікуєте прототип об'єкта, зверніть увагу на властивість constructor, оскільки вона може вказувати на інший об'єкт. Для відновлення правильного посилання на constructor потрібно його явно встановити.
function Cat(name) {
    this.name = name;
}

Cat.prototype = {
    meow: function() {
        console.log(this.name + " говорить м'яу!");
    }
};

// Відновлюємо правильне посилання на constructor
Cat.prototype.constructor = Cat;

const myCat = new Cat("Whiskers");
console.log(myCat.constructor === Cat);  // виведе true
  • Використання constructor для визначення типу об'єкта може бути ненадійним, якщо прототип об'єкта було змінено. Тому завжди перевіряйте, чи були зміни в прототипі, перед тим як використовувати constructor в таких випадках.
автор: Bond

Порада

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

автор: Bond
Порада

Хоча Object.prototype.constructor корисний для діагностики та інтроспекції, не слід використовувати його як основний спосіб визначення типу об'єкта на продакшені. Замість цього розглядайте використання instanceof або інших способів перевірки типів для більш надійних результатів.

автор: Bond
Порада

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

function Parent() {}
function Child() {}
Child.prototype = new Parent();
const kid = new Child();
console.log(kid.constructor === Parent); // true
автор: Bond
Нотатка

Метод Object.prototype.constructor є відмінним способом визначити конструктор об'єкта, особливо коли не відомо його безпосередній конструктор. Наприклад, якщо ви отримаєте об'єкт і хочете з'ясувати, з якої функції-конструктора він походить, використовуйте цей метод.

function Car(make, model) {
  this.make = make;
  this.model = model;
}
const myCar = new Car("Toyota", "Corolla");
console.log(myCar.constructor.name); // Виведе "Car"
автор: Bond

Синтаксис

Object.prototype.constructor

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
1 1 1 4 12 8
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
4.4 18 4 1
Підтримка: серверні переглядачі
Переглядач Node.js Deno
0.10.0 1.0

Приклади

+ запропонувати свій приклад у пісочниці

У цьому прикладі ми створимо новий об'єкт на основі функції-конструктора Car і потім визначимо його конструктор, використовуючи властивість constructor.

function Car(brand, model) {
    this.brand = brand;
    this.model = model;
}

// Створимо новий об'єкт
var myCar = new Car('Tesla', 'Model S');

// Перевіримо конструктор об'єкта
console.log(myCar.constructor === Car); // поверне true
автор: Bond

У цьому прикладі ми розширимо прототип вбудованого об'єкта Array новим методом isArrayOfNumbers(), який перевіряє, чи є всі елементи масиву числами. Для цього нам потрібно буде враховувати конструктор об'єкта.

Array.prototype.isArrayOfNumbers = function() {
    // перевіряємо, чи є поточний об'єкт екземпляром Array
    if (this.constructor !== Array) return false;

    // перевіряємо, чи є всі елементи числами
    for (let i = 0; i < this.length; i++) {
        if (typeof this[i] !== 'number') return false;
    }
    return true;
}

const arr1 = [1, 2, 3, 4];
const arr2 = [1, 'two', 3, 4];

console.log(arr1.isArrayOfNumbers()); // поверне true
console.log(arr2.isArrayOfNumbers()); // поверне false
автор: Bond

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід