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в таких випадках.
- Порада
-
При розширенні прототипів сторонніх об'єктів або класів завжди переконайтеся, що не перезаписали властивість
автор: Bondconstructor, оскільки це може призвести до непередбачуваних результатів при створенні нових екземплярів. - Порада
-
Хоча
автор: BondObject.prototype.constructorкорисний для діагностики та інтроспекції, не слід використовувати його як основний спосіб визначення типу об'єкта на продакшені. Замість цього розглядайте використанняinstanceofабо інших способів перевірки типів для більш надійних результатів. - Порада
-
Якщо ви працюєте з множинними рівнями наслідування, де дочірній об'єкт наслідує властивості батьківського, звертайте увагу на
constructor. Він буде посилатися на батьківський конструктор, а не на той, що був останнім в ланцюгу наслідування, якщо ви явно не встановите його для дочірнього об'єкта.
автор: Bondfunction Parent() {} function Child() {} Child.prototype = new Parent(); const kid = new Child(); console.log(kid.constructor === Parent); // true - Нотатка
-
Метод
Object.prototype.constructorє відмінним способом визначити конструктор об'єкта, особливо коли не відомо його безпосередній конструктор. Наприклад, якщо ви отримаєте об'єкт і хочете з'ясувати, з якої функції-конструктора він походить, використовуйте цей метод.
автор: Bondfunction Car(make, model) { this.make = make; this.model = model; } const myCar = new Car("Toyota", "Corolla"); console.log(myCar.constructor.name); // Виведе "Car"
Синтаксис
Object.prototype.constructor
Переглядачі
| Переглядач | |||||
|---|---|---|---|---|---|
| 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
Коментарі
Коментарів ще немає — будьте першим!