Как я могу написать функцию закрытия в геттере в ES6? - PullRequest
0 голосов
/ 03 июля 2018

В ES5 я могу написать так:

MyClass.prototype.value = (function() {
    var privateVariable = 0;
    return function() {
        return ++privateVariable;
    };
})();

Но в ES6, как я могу это сделать?

class MyClass {
    get value() {
        // return ??
    }
}

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Эквивалент ES5

function MyClass() {}
var privateVariable = 0;
MyClass.prototype = {
    get value() {
        return ++privateVariable;
    }
};

в ES6 class синтаксис будет

let privateVariable = 0;
class MyClass {
    get value() {
        return ++privateVariable;
    }
}

Неважно, поместите ли вы все это в IEFE или модуль или еще что-нибудь для локальной области, это одно и то же.

0 голосов
/ 03 июля 2018

Прямой аналог, который не является идиоматическим для классов ES6:

class MyClass {}
MyClass.prototype.value = (() => {
    let privateVariable = 0;
    return function() {
        return ++privateVariable;
    };
})();

Нет практических причин делать privateVariable полностью недоступным из внешней области видимости, тем более что он не очень хорошо работает с классами ES6. Это не может считаться правильной инкапсуляцией, потому что privateVariable недоступен для отражения; он также не может выступать в качестве защищенного члена.

Может быть закрытый член, который хранит значение:

class MyClass {
    constructor() {
         this._value = 0;
    }

    value() {
        return ++this._value;
    }
}

Это может быть символ, но это не делает дизайн класса более безопасным, просто добавляет дополнительные сложности, когда класс наследуется в другом модуле:

// should be carried around everywhere to make the class extendable
export const VALUE = Symbol('value');

class MyClass {
    constructor() {
         this[VALUE] = 0;
    }

    value() {
        return ++this[VALUE];
    }
}

Обратите внимание, что get value() {} не то же самое, что value() {}.

Одним из преимуществ TypeScript (который является расширенным набором ECMAScript) является инкапсуляция, которая применяется во время компиляции.

...