我试图将我的代码从ES5模块迁移到ES6类。我当前的代码(模块,而不是类),如下所示:
var appleModule = (function() {
var yummy = true;
var publicEat = function() { }
var privateEat = function() { }
return { "eat": publicEat }
})();
以上允许我创建我不会在我的环境中向其他Javascript对象/作用域公开的私有变量和方法。我喜欢。我想在ES6中我们现在有类,所以像这样的东西变成了重构的代码:
exports class appleModule {
constructor {
this.yummy = true;
}
publicEat() {
}
privateEat() {
// How to make private?
}
}
但是,使用这种新的基于类的语法创建私有变量和函数并不是一种好方法。新建议是否使用exports
与之前的模块模式(公共成员的闭包返回对象)?如果没有,我如何像第一个例子那样模拟私有范围(希望没有下划线)?
答案 0 :(得分:5)
我在ES6中认为我们现在有类,所以这样的东西就变成了重构的代码。
您的原始代码似乎代表了类似于模块的内容。类不是模块,但ES6现在具有对模块的本机支持。所以你的代码应该更有可能成为
var yummy = true;
var publicEat = function() { }
var privateEat = function() { }
export {publicEat as eat};
并非一切都可以,已经或应该被建模为一个类。
答案 1 :(得分:1)
ES6不提供私有变量的特定功能。 ES6类语法纯粹是常规.prototype
上的语法糖,因此使用纯ES6语法只能获得无法访问私有变量的原型方法。
如果你想要私有变量,你可以像之前那样在构造函数中定义它们,然后你必须定义想要在构造函数中访问那些私有的方法(它不会使用新的ES6语法)
答案 2 :(得分:1)
我通常把我不希望暴露在类定义之外的函数放在类中来访问它:
let privateMethod = function () {
// Some magic and return some value
// ...
return true;
}
class Foo {
constructor {
this.bar = 'baz';
}
publicMethod() {
// Calls method not visible outside to the caller
return privateMethod();
}
}
export Foo;