2015-10-24 30 views
3

我试图将我的代码从ES5模块迁移到ES6类。我当前的代码(模块,而不是类),如下所示:以上如何用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与之前的模块模式(返回公共成员的封闭对象)?如果不是,我如何像第一个例子那样模拟私人范围(希望没有下划线)?

回答

1

ES6不提供私有变量的特定功能。 ES6类语法纯粹是语法糖,因此使用纯ES6语法只会让原型中的方法无法访问私有变量。

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

5

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

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

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

export {publicEat as eat}; 

并非所有的东西都可以,或者应该被建模为一个类。

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;