メインコンテンツにスキップ

@babel/plugin-transform-private-property-in-object

情報

このプラグインは、ES2022で`@babel/preset-env`に含まれています。

入力

JavaScript
class Foo {
#bar = "bar";

test(obj) {
return #bar in obj;
}
}

出力

JavaScript
class Foo {
constructor() {
_bar.set(this, {
writable: true,
value: "bar",
});
}

test() {
return _bar.has(this);
}
}

var _bar = new WeakMap();

インストール

npm install --save-dev @babel/plugin-transform-private-property-in-object

使用方法

babel.config.json
{
"plugins": ["@babel/plugin-transform-private-property-in-object"]
}

CLI経由

シェル
babel --plugins @babel/plugin-transform-private-property-in-object

Node API経由

JavaScript
require("@babel/core").transformSync("code", {
plugins: ["@babel/plugin-transform-private-property-in-object"],
});

オプション

loose

boolean、デフォルトはfalse

注記

looseモードの設定は、@babel/transform-class-propertiesと同じである*必要があります*。

trueの場合、プライベートプロパティの`in`式は、`WeakSet`内での存在を確認する代わりに、オブジェクトの所有プロパティ(継承されたプロパティではなく)をチェックします。これにより、`Object.getOwnPropertyNames`などによって「プライベート」がリークする可能性がありますが、パフォーマンスとデバッグ(通常のプロパティアクセスと`.get()`)が向上します。

注意

トップレベルのprivateFieldsAsPropertiesの仮定に移行することを検討してください。

babel.config.json
{
"assumptions": {
"privateFieldsAsProperties": true,
"setPublicClassFields": true
}
}

`privateFieldsAsProperties`と`setPublicClassFields`の両方を`true`に設定する必要があることに注意してください。

入力

JavaScript
class Foo {
#bar = "bar";

test(obj) {
return #bar in obj;
}
}

出力

JavaScript
class Foo {
constructor() {
Object.defineProperty(this, _bar, {
writable: true,
value: "bar",
});
}

test() {
return Object.prototype.hasOwnProperty.call(this, _bar);
}
}

var _bar = babelHelpers.classPrivateFieldLooseKey("bar");
ヒント

プラグインオプションの設定について詳しくは、こちらをご覧ください。

参考文献