🎄

ENCA 20日目: クラスの name プロパティ設定を早める

2024/12/21に公開

クラスの name プロパティ

JavaScript のクラスは name プロパティが設定されるようになっています。これは SetFunctionName が実行されることによるもので、通常の函数と同様に、クラス宣言、クラス式問わずに設定されます。

// クラス宣言
class Foo {}
console.log(Foo.name); // "Foo"

// 変数宣言でクラス式を使う
const Bar = class {}
console.log(Bar.name); // "Bar"

クラスの name プロパティ設定を早める

ES2022 として Class Fields が入りました。その入った提案の中に Static Class Fields があります。

class Foo {
  static foo = "foo";
}
console.log(Foo.foo); // "foo"

この提案を進めるにあたってクラスの name プロパティ設定が仕様で後ろの方になっているため、Static Class Fields で name プロパティが利用できないと指摘されました。

class Foo {
  static foo = this.name;
}
console.log(Foo.name); // "Foo"
console.log(Foo.foo); // "Foo" ではなく "" になっていた

他にも将来デコレーターを入れる際にもこれは問題が起きる可能性があるとして、name プロパティの設定を ClassDefinitionEvaluation に移動することで早める変更が承認されました。

https://github.com/tc39/ecma262/pull/1372

Discussion