@babel/plugin-transform-new-target
Example
function Foo() {console.log(new.target);}Foo(); // => undefinednew Foo(); // => Foo
class Foo {constructor() {console.log(new.target);}}class Bar extends Foo {}new Foo(); // => Foonew Bar(); // => Bar
Caveats
This plugin relies on this.constructor, which means super mustalready have been called when using untransformed classes.
class Foo {}class Bar extends Foo {constructor() {// This will be a problem if classes aren't transformed to ES5new.target;super();}}
Additionally, this plugin cannot transform all Reflect.construct caseswhen using newTarget with ES5 function classes (transformed ES6 classes).
function Foo() {console.log(new.target);}// Bar extends Foo in ES5function Bar() {Foo.call(this);}Bar.prototype = Object.create(Foo.prototype);Bar.prototype.constructor = Bar;// Baz does not extend Foofunction Baz() {}Reflect.construct(Foo, []); // => Foo (correct)Reflect.construct(Foo, [], Bar); // => Bar (correct)Reflect.construct(Bar, []); // => Bar (incorrect, though this is how ES5// inheritance is commonly implemented.)Reflect.construct(Foo, [], Baz); // => undefined (incorrect)
Installation
npm install --save-dev @babel/plugin-transform-new-target
Usage
Via .babelrc (Recommended)
.babelrc
{"plugins": ["@babel/plugin-transform-new-target"]}
Via CLI
babel --plugins @babel/plugin-transform-new-target script.js
Via Node API
require("@babel/core").transform("code", {plugins: ["@babel/plugin-transform-new-target"]});