Как использовать несколько классов для изменения одного источника данных, не объявляя его глобальным? - PullRequest
0 голосов
/ 08 сентября 2018

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

Так что мне интересно, есть ли более изощренное решение для следующего?

let amount = {
  needed: 0,
}

class Store {
    constructor(a) {
    	this.needed = a.needed;
    }
    
    addNeeded(x) {
    	amount.needed += x;
        this.needed += x;
    }
    
    getNeeded() {
      return {
        amount: amount.needed,
        store: this.needed
      }
    }
}

const test1 = new Store(amount);
const test2 = new Store(amount);

test1.addNeeded(5); // this.needed returns 5, amount.needed is now 5
console.log(test1.getNeeded(), amount.needed);

test2.addNeeded(10); // this.needed return 10, amount.needed is now 15
console.log(test2.getNeeded(), amount.needed);

Как видите, this.needed создаст копию amount.needed в своем собственном экземпляре, если я передам объект его конструктору. Я чувствую, что упускаю что-то очень элементарное, и здесь есть более элегантное решение.

1 Ответ

0 голосов
/ 08 сентября 2018

Поскольку amount является объектом, вы можете сохранить ссылку на него и обновить его с помощью ссылки:

const amount = {
  needed: 0,
}

class Store {
  constructor(amount) {
    this.amount = amount;
  }

  addNeeded(x) {
    this.amount.needed += x;
  }

  getNeeded() {
    return {
      needed: this.amount.needed,
    }
  }
}

const test1 = new Store(amount);
const test2 = new Store(amount);

test1.addNeeded(5); // this.needed returns 5, amount.needed is now 5
console.log(test1.getNeeded(), amount.needed);
test2.addNeeded(10); // this.needed return 15, amount.needed is now 15
console.log(test2.getNeeded(), amount.needed);

Другой вариант - установить amount в качестве свойства статического класса ( требуется babel ).

Примечание: если вы не хотите (или не можете) использовать свойства статического класса, вы можете установить его вручную для класса Store.amount = { needed: 0 }.

class Store {
  static amount = {
    needed: 0,
  };

  constructor(amount) {
    this.needed = Store.amount.needed;
  }

  addNeeded(x) {
    Store.amount.needed += x;
  }

  getNeeded() {
    return {
      needed: Store.amount.needed,
    }
  }
}

// Store.amount = { needed: 0 } // instead of using static

const test1 = new Store();
const test2 = new Store();

test1.addNeeded(5); // this.needed returns 5, amount.needed is now 5
console.log(test1.getNeeded(), Store.amount.needed);
test2.addNeeded(10); // this.needed return 15, amount.needed is now 15
console.log(test2.getNeeded(), Store.amount.needed);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...