2015-10-24 61 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;