Подтвердить что ты не робот

Имейте частные свойства и методы в классах ES6

Я просто тестирую ES6 и хочу переписать часть кода, написанную на обычном javascript, на ES6. И теперь я застреваю при попытке переписать частные свойства и методы в классах ES6. Кажется, что классы в ES6 явно не предоставляют никаких личных данных или методов.

Кроме того, я проверил этот поток: Частные свойства в классах JavaScript ES6 и выяснил, что мы могли бы использовать WeakMap для хранения личных данных. Что-то вроде странно, но все же это может быть работа. И мне удалось использовать его для частных данных.

Но как насчет частных методов? Каков рекомендуемый способ использования частных методов (или даже защищенных методов) в классах 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) {
        ...
    }
}
4b9b3361

Ответ 1

Похоже, что классы в 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) {
            …
        };
    }
}

Ответ 2

Вы можете использовать символы, чтобы дать своего рода частный член.

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

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

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

  [ ANOTHER ] = 'transpilation required'
}

2-й символ добавляется в класс с помощью поля класса , это только в предложении и потребует транспиляции для работы в любом месте, но отдых работает в node и новых браузерах.