--- title: new.target slug: Web/JavaScript/Reference/Operators/new.target tags: - ECMAScript6 - JavaScript translation_of: Web/JavaScript/Reference/Operators/new.target ---
new.target позволяет определить была ли функция или конструктор вызваны с помощью оператора new. В конструкторах и функциях инстанциированных с помощью оператора new, new.target возвращает ссылку на конструктор или функцию. При обычном вызове функции new.target имеет значение {{jsxref("undefined")}}.new.target
Синтаксис new.target состоит из ключевого слова"new", точки, и свойства "target". Обычно "new." служит контекстом для доступа к свойству, но здесь "new." не совсем объект. Однако при вызове конструктора, new.target ссылается на конструктор вызванный с помощью new и таким образом "new." становится виртуальным контекстом.
Свойство new.target это мета свойство которое доступно во всех функциях. В стрелочных функция, new.target ссылается на new.target внешней функции.
При обычном вызове функции (в противоположность вызову в качестве конструктора), new.target имеет значение {{jsxref("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. Это верно и для случая, когда 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"
| Спецификация | Статус | Комментарии |
|---|---|---|
| {{SpecName('ES6', '#sec-built-in-function-objects', 'Built-in Function Objects')}} | {{Spec2('ES6')}} | Изначальное определение. |
| {{SpecName('ESDraft', '#sec-built-in-function-objects', 'Built-in Function Objects')}} | {{Spec2('ESDraft')}} |
{{CompatibilityTable}}
| Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Базовая поддержка | {{CompatChrome(46.0)}} | {{CompatGeckoDesktop(41)}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
| Возможность | Android | Android Webview | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
|---|---|---|---|---|---|---|---|
| Базовая поддержка | {{CompatNo}} | {{CompatChrome(46.0)}} | {{CompatGeckoMobile(41)}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatChrome(46.0)}} |