Ciekawy kod, jaki znalazłem w internecie zawierający domknięcie oraz literał obiektu. Zobaczmy, jak to działa. Do dzieła!

Oto kod:

function createCounter(){
    let num = 0;

    return {
        get() {
            return num;
        },
        increment(){
            return ++num;
        },
        decrement(){
            return --num;
        }

    }
}

let counter1 = createCounter();
counter1.increment();
counter1.increment();
counter1.increment();
console.log(counter1.get()); //3

To samo moglibyśmy osiągnąć w ten sposób:

function createCounter(){

    return {
        num: 0,
        get() {
            return this.num;
        },
        increment(){
            return ++this.num;
        },
        decrement(){
            return --this.num;
        }

    }
}

Czy jest w ogóle jakaś różnica? Pomyślmy. Intuicja może nam podpowiadać, że w pierwszym przypadku mamy do czynienia ze zmienną statyczną i wszystkie countery będą miały ten sam num.

I intuicja będzie nam źle podpowiadać, literał obiektu to nie klasa. Oto dowód:

function createCounter(){
    let num = 0;

    return {
        get() {
            return num;
        },
        increment(){
            return ++num;
        },
        decrement(){
            return --num;
        }

    }
}

let counter1 = createCounter();

counter1.increment();
counter1.increment();
counter1.increment();

console.log(counter1.get()); //3

let counter2 = createCounter();

console.log(counter2.get()); //0
console.log(counter1.get()); //3

Jak widać mamy tu do czynienia z typowym dla obiektówki innych języków polem instancji a nie polem statycznym klasy. Jakiej klasy, nie ma żadnej klasy. Natomiast obiekt ma dostęp do zmiennej poprzez domknięcie, tak jak to mamy w funkcjach wyższego rzędu.

Dziwne, ale kod ładny.