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
1 1 1 4 12
Підтримка: мобільні переглядачі
Переглядач 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

Коментарі

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

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

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

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

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

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

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

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

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

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

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