如何在javascript类中模拟保护变量?
How to simulate protected variables in javascript classes?
在javascript中模拟受保护变量的最佳方法是什么?
class Parent{
#variable; // Private variable. This is not to be public.
constructor(value)
{
this.#variable = value;
}
}
class Child extends Parent{
getNewVariable()
{
return (1 + this.#variable); // Uncaught SyntaxError: Private field '#variable' must be declared in an enclosing class
// We want #variable to be accessible without making it public.
}
}
由于javascript还不支持保护变量,
在扩展 类 中从 super类 访问私有变量的最佳选择是什么?
我找不到很多这方面的文档,所以任何建议都会很有帮助。
使用 TypeScript 怎么样? TypeScript 类 支持 protected
关键字 (see docs),并且比 vanilla JavaScript.
有很多额外的好处
+++ 迟到的答案,但我们开始了...... +++
基于 WeakMap
的方法很可能涵盖了 OP 正在寻找的内容...
const protectedStatesMap = new WeakMap;
class Parent{
constructor(foo) {
protectedStatesMap.set(this, { foo });
}
getFoo() {
return protectedStatesMap.get(this).foo;
}
}
class Child extends Parent{
constructor(foo, bar) {
super(foo);
Object.assign(protectedStatesMap.get(this), { bar })
}
getBar() {
return protectedStatesMap.get(this).bar;
}
}
const childA = new Child('foo', 'bar');
const childB = new Child('baz', 'biz');
console.log('childA.getFoo() ...', childA.getFoo());
console.log('childA.getBar() ...', childA.getBar());
console.log('childB.getFoo() ...', childB.getFoo());
console.log('childB.getBar() ...', childB.getBar());
.as-console-wrapper { min-height: 100%!important; top: 0; }
在javascript中模拟受保护变量的最佳方法是什么?
class Parent{
#variable; // Private variable. This is not to be public.
constructor(value)
{
this.#variable = value;
}
}
class Child extends Parent{
getNewVariable()
{
return (1 + this.#variable); // Uncaught SyntaxError: Private field '#variable' must be declared in an enclosing class
// We want #variable to be accessible without making it public.
}
}
由于javascript还不支持保护变量,
在扩展 类 中从 super类 访问私有变量的最佳选择是什么?
我找不到很多这方面的文档,所以任何建议都会很有帮助。
使用 TypeScript 怎么样? TypeScript 类 支持 protected
关键字 (see docs),并且比 vanilla JavaScript.
+++ 迟到的答案,但我们开始了...... +++
基于 WeakMap
的方法很可能涵盖了 OP 正在寻找的内容...
const protectedStatesMap = new WeakMap;
class Parent{
constructor(foo) {
protectedStatesMap.set(this, { foo });
}
getFoo() {
return protectedStatesMap.get(this).foo;
}
}
class Child extends Parent{
constructor(foo, bar) {
super(foo);
Object.assign(protectedStatesMap.get(this), { bar })
}
getBar() {
return protectedStatesMap.get(this).bar;
}
}
const childA = new Child('foo', 'bar');
const childB = new Child('baz', 'biz');
console.log('childA.getFoo() ...', childA.getFoo());
console.log('childA.getBar() ...', childA.getBar());
console.log('childB.getFoo() ...', childB.getFoo());
console.log('childB.getBar() ...', childB.getBar());
.as-console-wrapper { min-height: 100%!important; top: 0; }