new.target

Псевдовластивість new.target дозволяє виявляти, чи були функції або конструктори створені за допомогою оператора new. У конструкторах та функціях, запущених з використанням оператора new, new.target повертає посилання на конструктор або функцію. У звичайних викликах функцій new.target дорівнює undefined.

Синтаксис

new.target

Опис

Синтаксис new.target складається з ключового слова new, крапки та ідентифікатора target. Зазвичай, зліва від крапки стоїть об'єкт, до властивості якого здійснюється звернення, але тут new не є об'єктом.

Псевдовластивість new.target доступна в усіх функціях. У конструкторах класів вона посилається на зконструйований клас. У звичайних функціях вона посилається на саму функцію, за умови, що вона була викликана з використанням оператора new; в інших випадках new.target дорівнює undefined. У стрілкових функціях new.target успадковується від оточуючої області видимості.

Приклади

new.target у викликах функцій

У звичайних викликах функцій (як протилежність викликам конструкторів) new.target дорівнює undefined. Це дозволяє визначити, чи була функція викликана з new як конструктор.

function Foo() {
  if (!new.target) throw 'Foo() має викликатись з new';
  console.log('Foo викликано з new');
}

new Foo(); // виводить "Foo викликано з new"
Foo(); // викидає "Foo() має викликатись з new"

new.target у конструкторах

У конструкторах класів new.target посилається на конструктор, що був безпосередньо викликаний new. Це також стосується випадку, коли конструктор знаходиться у батьківському класі та був делегований з дочірнього конструктора.

class A {
  constructor() {
    console.log(new.target.name);
  }
}

class B extends A { constructor() { super(); } }

var a = new A(); // виводить "A"
var b = new B(); // виводить "B"

class C { constructor() { console.log(new.target); } }
class D extends C { constructor() { super(); } }

var c = new C(); // виводить class C{constructor(){console.log(new.target);}}
var d = new D(); // виводить class D extends C{constructor(){super();}}

Отже, з наведеного вище прикладу класів C та D, схоже, що new.target вказує на визначення класу, екземпляр якого було ініціалізовано. Наприклад, коли було ініціалізовано екземпляр D за допомогою new, було виведено визначення класу D, і схожим чином у випадку з c, було виведено клас C.

Специфікації

Сумісність з веб-переглядачами

BCD tables only load in the browser

Див. також