JS властивість Object.constructor
Загальний опис
У JavaScript кожен об'єкт має властивість, звану constructor
, яка посилається на конструктор-функцію, що створила цей об'єкт. Для об'єктів, які були створені конструктором-функцією, наприклад, за допомогою ключового слова new
, властивість constructor
є корисним засобом для ідентифікації типу об'єкта та доступу до його конструктора.
Використання constructor
від простих до складних випадків
- Основне використання: Якщо ви створите об'єкт за допомогою конструктора, можна використовувати властивість
constructor
, щоб з'ясувати, яка функція його створила.
function Car(model, year) {
this.model = model;
this.year = year;
}
const myCar = new Car("Tesla", 2022);
console.log(myCar.constructor === Car); // виведе true
- Створення екземпляру за допомогою
constructor
: Можна використовуватиconstructor
для створення нового екземпляра об'єкта без прямого звертання до конструктора.
const anotherCar = new myCar.constructor("Audi", 2023);
- Визначення типу об'єкта: Властивість
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
в таких випадках.
Нотатка: | Метод
|
Порада: | При розширенні прототипів сторонніх об'єктів або класів завжди переконайтеся, що не перезаписали властивість |
Порада: | Якщо ви працюєте з множинними рівнями наслідування, де дочірній об'єкт наслідує властивості батьківського, звертайте увагу на
|
Порада: | Хоча |
Синтаксис
Object.prototype.constructor
Значення
Return
Переглядачі
Переглядач | |||||
---|---|---|---|---|---|
1 |
1 |
1 |
4 |
12 |
Переглядач | ||||
---|---|---|---|---|
4.4 |
18 |
4 |
1 |
Переглядач | ||
---|---|---|
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
У цьому прикладі ми розширимо прототип вбудованого об'єкта 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