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 или нет.
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
находится в конструкторе родительского класса, а тот в свою очередь вызывается из конструктора дочернего класса.
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 Language Specification # sec-built-in-function-objects |
Совместимость с браузерами
BCD tables only load in the browser