如何使用 Traceur 在 ES6 类中实现私有方法

我现在使用Tracer Compiler来利用ES6功能。

我想从ES5实现这个东西:

function Animal() {
    var self = this,
        sayHi;

    sayHi  = function() {
        self.hi();
    };

    this.hi = function() {/* ... */}
}

目前 traceur 不支持和关键字(来自 harmony)。而ES6类语法不允许在类体中使用简单(或)语句。privatepublicvarlet

我发现的唯一方法是在类声明之前模拟私有。像这样:

var sayHi = function() {
    // ... do stuff
};

class Animal {
...

最好是没有,但正如预期的那样,你不能在没有-ing或-ing的情况下每次都正确传递给私有方法。thisapplybind

那么,有没有可能在与tracer编译器兼容的ES6类中使用私有数据呢?


答案 1

在当前的 ECMAScript 6 规范中没有 或关键字。privatepublicprotected

所以 Traceur 不支持 和 。6to5(目前称为“Babel”)为了实现这个实验目的的提议(另见这个讨论)。但毕竟这只是建议。privatepublic

因此,现在您可以通过模拟私有属性(请参阅此处)。另一种选择是 - 但它不提供实际的隐私,因为可以通过轻松访问该物业。WeakMapSymbolObject.getOwnPropertySymbols

恕我直言,这是目前最好的解决方案-只需使用伪隐私即可。如果您经常使用或与您的方法一起使用,则此方法非常特定于对象。因此,值得在类中仅使用下划线前缀声明它:applycall

class Animal {

    _sayHi() {
        // do stuff
    }
}

答案 2

您始终可以使用正常功能:

function myPrivateFunction() {
  console.log("My property: " + this.prop);
}

class MyClass() {
  constructor() {
    this.prop = "myProp";
    myPrivateFunction.bind(this)();
  }
}

new MyClass(); // 'My property: myProp'