Previously, computed class properties would be evaluated every time a new instance of the class was created. This means the property name may have changed between different instances, as well as potential side effects. This commit fixes this by storing the computed value in a separate variable.
babel-plugin-transform-class-properties
This plugin transforms class properties
Example
Below is a class with four class properties which will be transformed.
class Bork {
//Property initializer syntax
instanceProperty = "bork";
boundFunction = () => {
return this.instanceProperty;
};
//Static class properties
static staticProperty = "babelIsCool";
static staticFunction = function() {
return Bork.staticProperty;
};
}
let myBork = new Bork;
//Property initializers are not on the prototype.
console.log(myBork.__proto__.boundFunction); // > undefined
//Bound functions are bound to the class instance.
console.log(myBork.boundFunction.call(undefined)); // > "bork"
//Static function exists on the class.
console.log(Bork.staticFunction()); // > "babelIsCool"
Installation
npm install --save-dev babel-plugin-transform-class-properties
Usage
Via .babelrc (Recommended)
.babelrc
Without options:
{
"plugins": ["transform-class-properties"]
}
With options:
{
"plugins": [
["transform-class-properties", { "loose": true }]
]
}
Via CLI
babel --plugins transform-class-properties script.js
Via Node API
require("babel-core").transform("code", {
plugins: ["transform-class-properties"]
});
Options
loose
boolean, defaults to false.
When true, class properties are compiled to use an assignment expression instead of Object.defineProperty.
Example
class Bork {
static a = 'foo';
static b;
x = 'bar';
y;
}
Without { "loose": true }, the above code will compile to the following, using Object.definePropery:
var Bork = function Bork() {
babelHelpers.classCallCheck(this, Bork);
Object.defineProperty(this, "x", {
configurable: true,
enumerable: true,
writable: true,
value: 'bar'
});
Object.defineProperty(this, "y", {
configurable: true,
enumerable: true,
writable: true,
value: void 0
});
};
Object.defineProperty(Bork, "a", {
configurable: true,
enumerable: true,
writable: true,
value: 'foo'
});
Object.defineProperty(Bork, "b", {
configurable: true,
enumerable: true,
writable: true,
value: void 0
});
However, with { "loose": true }, it will compile using assignment expressions:
var Bork = function Bork() {
babelHelpers.classCallCheck(this, Bork);
this.x = 'bar';
this.y = void 0;
};
Bork.a = 'foo';
Bork.b = void 0;