【问题标题】:How to simulate private scope with ES6 classes?如何使用 ES6 类模拟私有作用域?
【发布时间】:2016-01-24 06:51:12
【问题描述】:

我正在尝试将我的代码从 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 与以前的模块模式(公共成员的闭包返回对象)一起使用?如果不是,我如何像第一个示例那样模拟私有作用域(希望没有下划线)?

【问题讨论】:

    标签: javascript class module scope ecmascript-6


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      我认为在 ES6 中我们现在有了类,所以这样的东西变成了重构代码。

      您的原始代码似乎代表了一个模块。类不是模块,但 ES6 现在对模块有原生支持。所以你的代码应该更有可能变成

      var yummy = true;
      var publicEat = function() { }
      var privateEat = function() { }
      
      export {publicEat as eat};
      

      并非所有事物都可以、已经或应该被建模为一个类。

      【讨论】:

        【解决方案3】:

        ES6 没有为私有变量提供特定的功能。 ES6 类语法是常规 .prototype 上的纯语法糖,因此使用纯 ES6 语法只会让您获得无法访问私有变量的原型上的方法。

        如果你想要私有变量,你可以像以前一样在构造函数中定义它们,然后你必须在构造函数中定义想要访问这些私有变量的方法(这不会使用新的 ES6 语法) .

        【讨论】:

          猜你喜欢
          • 2017-09-30
          • 2018-05-04
          • 2018-10-27
          • 2015-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-23
          • 1970-01-01
          相关资源
          最近更新 更多