@para_noir_in_my_box

Как собрать проект в gulp+browserify, чтобы на выходе можно было создавать полностью независимые объекты классов?

Было разработано приложение, на выходе - возможность создавать объект и работать с ним.
Но вот потребовалось на одной и той же странице создать второй объект этого класса и я понял что допустил фундаментальную ошибку при разработке.
Сейчас опишу пример.

main.js
import App from './app.js';
window.App = App;


app.js
import {increment} from './counter.js';
import {subIncrement} from './sub-counter.js';

export default class App {
    increment() {
        increment();
    }
    subIncrement() {
        subIncrement();
    }
}


counter.js
let i=0;

export function increment() {
    i++;
    console.log(i);
}


sub-counter.js
import {increment} from './counter.js';

export function subIncrement() {
    increment();
}


index.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Новости</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    </head>
    <body>
        <script>
            function loadApplication() {
                let app1 = new App;
                app1.increment();
                app1.increment();
                app1.subIncrement();

                let app2 = new App;
                app2.increment();
                app2.increment();
                app2.subIncrement();
            }
        </script>
        <script
            src="./js/main.js"
            onload="loadApplication();"
        ></script>
    </body>
</html>


В консоли видим
1
2
3
4
5
6


То есть код подключаемых модулей не замкнут на экземпляре класса, который был создан, он общий для всех.
А хочется чтобы все что подключается в проекте было в контексте создаваемых объектов.

Модули вроде counter.js подключаются в проекте очень много где. Как вариант тащить каким-то образом от класса вниз некий id объекта, чтобы внутри модулей была работа в контексте этого id, но придется переписать почти все модули и всех, кто их использует.

Пытался придумать как замкнуть все это внутрь какой-нибудь (function(){})(), но не хватило ума.
  • Вопрос задан
  • 28 просмотров
Пригласить эксперта
Ответы на вопрос 1
Потому что Вы напрямую работаете только с одним файлом - counter.js. Хотите каждый раз новый контекст - делайте мини-фабрику (функцию высшего порядка):
function createCounter() {
    let counter = 0;

    function increment() {
        counter++;
        console.log(counter);
    }

    function decrement() {
        counter--;
        console.log(counter);
    }

    return {
        get value() {
            return counter;
        },
        increment,
        decrement
    };
}

и в классе уже их инициализируете:
class App {
    constructor() {
        this.counter = createCounter();
        this.subCounter = createCounter();
    }

    increment() {
        this.counter.increment();
    }

    subIncrement() {
        this.subCounter.increment();
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы