簡體   English   中英

如何使用ES6類模擬私有范圍?

[英]How to simulate private scope with ES6 classes?

我正在嘗試將我的代碼從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 (公共成員的閉包返回對象)? 如果沒有,我怎么能像第一個例子那樣模擬私有范圍(希望沒有下划線)?

我想在ES6中我們現在有類,所以像這樣的東西變成了重構的代碼。

您的原始代碼似乎代表了類似於模塊的東西。 類不是模塊,但ES6現在具有對模塊的本機支持。 所以你的代碼應該更有可能成為

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

export {publicEat as eat};

並非一切都可以,已經或應該被建模為一個類。

ES6不提供私有變量的特定功能。 ES6類語法純粹是常規.prototype上的語法糖,因此使用純ES6語法只會獲得無法訪問私有變量的原型方法。

如果你想要私有變量,你可以像之前那樣在構造函數中定義它們,然后你必須定義想要在構造函數中訪問那些私有的方法(它不會使用新的ES6語法)。

我通常把我不想暴露的函數放在類定義之外,並從類中訪問它:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM