Node.js 12 поддерживает поля закрытого класса, обозначенные #"из коробки", без флагов и транспилеров.
Например, это работает с Node.js 12:
class Foo {
#bar = 1;
constructor({ bar }) {
this.#bar = bar;
}
get bar() {
return this.#bar;
}
}
const foo = new Foo({ bar: 2 });
console.log(foo.bar); // 2
Допустим, я хочу создать свой экземпляр Foo не с 1 свойством, а с 20 - мне пришлось бы дублировать оператор присваивания в конструкторе и функции-получателе 20 раз, что составляет много шаблонного кода.
Если бы я не использовал частные поля, а обычные поля класса, этого было бы несложно избежать:
class Foo {
bar = 1;
constructor(properties) {
Object.entries(properties).forEach(([name, value]) => (this[name] = value));
}
get bar() {
return this.bar;
}
}
const foo = new Foo({ bar: 2 });
console.log(foo.bar); // 2
Однако с частнымполя класса, это не работает:
class Foo {
#bar = 1;
constructor(properties) {
Object.entries(properties).forEach(
([name, value]) => (this[`#${name}`] = value)
);
}
get bar() {
return this.#bar;
}
}
const foo = new Foo({ bar: 2 });
console.log(foo.bar); // 1 :-(
Я также попытался присвоить значение полю частного класса в конструкторе, используя Reflect.set , но безрезультатно:
class Foo {
#bar = 1;
constructor(properties) {
Object.entries(properties).forEach(([name, value]) =>
Reflect.set(this, `#${name}`, value)
);
}
get bar() {
return this.#bar;
}
}
const foo = new Foo({ bar: 2 });
console.log(foo.bar); // 1 :-(
Могу ли я установить поле частного класса, используя переменную в качестве идентификатора? Если да, то как?