Package Exports
- @babel/plugin-transform-new-target
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@babel/plugin-transform-new-target) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
@babel/plugin-transform-new-target
This plugins allows babel to transform new.target
meta property into a
(correct in most cases) this.constructor
expression.
Example
function Foo() {
console.log(new.target);
}
Foo(); // => undefined
new Foo(); // => Foo
class Foo {
constructor() {
console.log(new.target);
}
}
class Bar extends Foo {
}
new Foo(); // => Foo
new Bar(); // => Bar
Caveats
This plugin relies on this.constructor
, which means super
must
already 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 ES5
new.target;
super();
}
}
Additionally, this plugin cannot transform all Reflect.construct
cases
when using newTarget
with ES5 function classes (transformed ES6 classes).
function Foo() {
console.log(new.target);
}
// Bar extends Foo in ES5
function Bar() {
Foo.call(this);
}
Bar.prototype = Object.create(Foo.prototype);
Bar.prototype.constructor = Bar;
// Baz does not extend Foo
function Baz() {}
Reflect.construct(Foo, []); // => Foo (correct)
Reflect.construct(Foo, [], Bar); // => Bar (correct)
Reflect.construct(Bar, []); // => Bar (incorrect, though this is how ES5
// inheritience 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"]
});