Javascript Typescript或babel插件将ES6类转换为作用域变量作为私有属性模式的函数

Javascript Typescript或babel插件将ES6类转换为作用域变量作为私有属性模式的函数,javascript,typescript,babeljs,transpiler,Javascript,Typescript,Babeljs,Transpiler,背景:不久前,使用作用域变量作为私有属性或方法的函数是在JavaScript中创建类的一种非常有效的方法。今天的标准是使用prototype和this关键字这一更为冗长、文件大小更为低效的方法。此外,现代方法的灵活性较低 是否有任何转换插件将ES6类转换为具有作用域变量作为实例私有变量的函数?代码: 类MyClass{ private myProp=“hello”//或带有新语法的#myProp private myProp2=“World”//或带有新语法的#myProp2 打印(){ log

背景:不久前,使用作用域变量作为私有属性或方法的函数是在JavaScript中创建类的一种非常有效的方法。今天的标准是使用
prototype
this
关键字这一更为冗长、文件大小更为低效的方法。此外,现代方法的灵活性较低

是否有任何转换插件将ES6类转换为具有作用域变量作为实例私有变量的函数?代码:

类MyClass{
private myProp=“hello”//或带有新语法的#myProp
private myProp2=“World”//或带有新语法的#myProp2
打印(){
log(this.myProp+this.myProp2);
}
}
进入:

函数MyClass(){
var self=这个,
myProp=“你好”,
myProp2=“世界”;
self.print=函数(){
console.log(myProp+myProp2);
}
}
有什么建议吗

注意:我知道JavaScript原型是如何工作的,第二种方法没有使用它。这个问题的全部要点是找到一个Transfilation替代上面所示的原型模式,它是100%有效的,相当于类的典型用例。即
myClass.print()

更新2:对于那些考虑内存占用的人来说,他们是对的。JavaScript引擎的性能不是问题,因为不太老的和现代的引擎都考虑了这种方法


更新3:此外,此模式可以提供类继承、公共/私有静态方法,并且它与基类和父类上的“instanceof”运算符完全兼容。

这些是不等效的
print
继续
MyClass。prototype
,而不是在实例上。TS转换为es5语法意味着私有变量是模糊的,而不是显式私有的(例如
\u privateVar
)-从技术上讲,您可以确保这些变量仅在函数或词法范围内定义-但我认为这就足够帮助您了为什么?在所有条件相同的情况下,让编译器完成它的工作。Typescript有一个您已经知道的真正私有实例变量的解决方案。代码中的
太多了。
永远不会成为库太大的原因,特别是在JS资产的gzip中。最后,typescript应该与完全跳过
关键字以及使用带有手动设置原型的构造函数兼容。@我同意你的说法,但我不同意“typescript有一个你已经知道的真正私有实例变量的解决方案”。Typescript在将ESNext类转换为ES5“类”时(正式)不提供任何转换模式来实现“真正私有的实例变量/属性/方法”。“更详细和文件大小效率更低的方法”-什么?您的第二个代码段比第一个代码段长。(顺便说一句,我想你指的是
myProp
,而不是
self.myProp
)这些并不等同
print
继续
MyClass。prototype
,而不是在实例上。TS转换为es5语法意味着私有变量是模糊的,而不是显式私有的(例如
\u privateVar
)-从技术上讲,您可以确保这些变量仅在函数或词法范围内定义-但我认为这就足够帮助您了为什么?在所有条件相同的情况下,让编译器完成它的工作。Typescript有一个您已经知道的真正私有实例变量的解决方案。代码中的
太多了。
永远不会成为库太大的原因,特别是在JS资产的gzip中。最后,typescript应该与完全跳过
关键字以及使用带有手动设置原型的构造函数兼容。@我同意你的说法,但我不同意“typescript有一个你已经知道的真正私有实例变量的解决方案”。Typescript在将ESNext类转换为ES5“类”时(正式)不提供任何转换模式来实现“真正私有的实例变量/属性/方法”。“更详细和文件大小效率更低的方法”-什么?您的第二个代码段比第一个代码段长。(顺便说一句,我想你是指
myProp
而不是
self.myProp