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.

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

Специфікація Статус Коментар
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Built-in Function Objects' in that specification.
Standard Початкове визначення.
ECMAScript Latest Draft (ECMA-262)
The definition of 'Built-in Function Objects' in that specification.
Draft

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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
new.targetChrome Full support 46Edge Full support 13Firefox Full support 41IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support 46Chrome Android Full support 46Firefox Android Full support 41Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support 5.0nodejs Full support 5.0.0

Legend

Full support  
Full support
No support  
No support

Див. також