new.target

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since March 2016.

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

Синтаксис

new.target

Описание

Синтаксис new.target состоит из ключевого слова new, точки, и свойства target. Обычно new служит контекстом для доступа к свойству, но здесь new не совсем объект. Однако при вызове конструктора, new.target ссылается на конструктор вызванный с помощью new и таким образом new становится виртуальным контекстом.

Свойство new.target это мета свойство которое доступно во всех функциях. В стрелочных функция, new.target ссылается на new.target внешней функции.

Примеры

new.target в вызове функции

При обычном вызове функции (в противоположность вызову в качестве конструктора), new.target имеет значение undefined. Это позволяет определить была ли вызвана функция как конструктор через new или нет.

js
function Foo() {
  if (!new.target) throw "Foo() must be called with new";
  console.log("Foo instantiated with new");
}

new Foo(); // выведет "Foo instantiated with new"
Foo(); // ошибка "Foo() must be called with new"

new.target в конструкторе

В конструкторе класса, new.target ссылается на конструктор, который был непосредственно вызван new. Это верно и для случая, когда new.target находится в конструкторе родительского класса, а тот в свою очередь вызывается из конструктора дочернего класса.

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

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

var a = new A(); // вернёт "A"
var b = new B(); // вернёт "B"

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

Specification
ECMAScript® 2025 Language Specification
# sec-built-in-function-objects

Совместимость с браузерами

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
new.target

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

Смотрите также