如何使用ES6类模拟私有范围?

时间:2015-10-24 23:04:17

标签: javascript class module scope ecmascript-6

我试图将我的代码从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与之前的模块模式(公共成员的闭包返回对象)?如果没有,我如何像第一个例子那样模拟私有范围(希望没有下划线)?

3 个答案:

答案 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;