Javascript 拥有私人物业及;ES6类中的方法

Javascript 拥有私人物业及;ES6类中的方法,javascript,class,ecmascript-6,Javascript,Class,Ecmascript 6,我只是在尝试ES6,希望将用常规javascript编写的部分代码重写到ES6。现在,我在尝试重新编写ES6类中的私有属性和方法时陷入了困境。ES6中的类似乎没有显式提供任何私有数据或方法 另外,我检查了这个线程:发现我们可以使用它来存储私有数据。这有点奇怪,但它仍然可以是一个解决办法。我确实设法将其用于私人数据 但是私有方法呢?建议在ES6类中使用私有方法(甚至是受保护的方法)的方法是什么 如果有人能给我一个干净的方法,用ES6类和私有方法重写这部分代码,我将不胜感激 谢谢 下面是简单的老ja

我只是在尝试ES6,希望将用常规javascript编写的部分代码重写到ES6。现在,我在尝试重新编写ES6类中的私有属性和方法时陷入了困境。ES6中的类似乎没有显式提供任何私有数据或方法

另外,我检查了这个线程:发现我们可以使用它来存储私有数据。这有点奇怪,但它仍然可以是一个解决办法。我确实设法将其用于私人数据

但是私有方法呢?建议在ES6类中使用私有方法(甚至是受保护的方法)的方法是什么

如果有人能给我一个干净的方法,用ES6类和私有方法重写这部分代码,我将不胜感激

谢谢

下面是简单的老javascript代码:

function Deferred() {

    // Private data
    var isPending;
    var handlers = {
        resolve: [],
        reject: [],
        notify: []
    };

    // Initialize the instance
    init();

    function init() {
        isPending = true;
        this.promise = new Promise(this);
    }

    // Public methods
    this.resolve = function(value) {
        trigger('resolve', value);
    };

    this.reject = function(reason) {
        trigger('reject', reason);
    };

    this.notify = function(value) {
        trigger('notify', value);
    };

    this.on = function(event, handler) {
        ...
    };

    // Private method
    function trigger (event, params) {
        ...
    }
}
ES6中的类似乎没有显式提供任何私有数据或方法

对。
class
语法适用于带有原型方法的普通类。如果需要私有变量,请将它们一如既往地放在构造函数中:

class Deferred {
    constructor() {
        // initialise private data
        var isPending = true;
        var handlers = {
            resolve: [],
            reject: [],
            notify: []
        };

        // Private method
        function trigger(event, params) {
            ...
        }

        // initialise public properties
        this.promise = new Promise(this);

        // and create privileged methods
        this.resolve = trigger.bind(null, 'resolve');
        this.reject = trigger.bind(null, 'reject');
        this.notify = trigger.bind(null, 'notify');

        this.on = function(event, handler) {
            …
        };
    }
}

您可以使用符号来指定某种私有成员

const KEY = Symbol( 'key' )
const ANOTHER = Symbol( 'another' )

class Foo {
  constructor() {
    this[ KEY ] = 'private'
  }

  say() {
    console.log( this[ KEY ] )
  }

  [ ANOTHER ] = 'transpilation required'
}

第二个符号是使用a添加到类中的,这仅在建议中,需要透明才能在任何地方工作,但其余符号在节点和新浏览器中工作

这篇文章应该有足够的信息,看起来还可以。但是,如果这是唯一的方法,我认为使用旧的javascript
function()
样式会更“干净”。因为在这个场景中,ES6类并没有什么可以做的。我希望您至少有一些原型方法,不是吗?这里的“私有”内容只在构造函数中可用。您必须放弃使用类getter和setter以及类方法来实现这一点(或者至少是那些涉及所谓“私有”成员的方法)。在这种情况下,您将简化为单个对象生成函数,这与“传统”类函数没有任何区别。@Sahuagin符号不是私有的。它们与以下划线为前缀的属性名一样好。是的,在JS中实现“隐私”还有其他方法,但这里OP特别要求与他的ES5代码等效的东西。是的,语法是不同的,它们隐藏在通常的(ES5)内省方法中,但它们并不真正无法访问,也不比其他属性更安全。这是奇怪的语法,感觉有点像黑客,但它确实有效,基本上等同于真正的私人会员。我认为这也是一个好主意,但这个房产并不是真正的私人。您不能使用
instance.key
访问该值,但仍然可以使用
instance[Object.getOwnPropertySymbols(instance.filter(s=>s.toString().replace(/^Symbol\([^]+)\)$/,“$1')==='key')[0]
您可以这样做。。。