2015-10-24 2 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 является чисто синтаксическим сахаром на регулярном .prototype, поэтому использование чистого синтаксиса 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; 
Смежные вопросы