Пример функции составной стрелки в видео? - PullRequest
0 голосов
/ 24 февраля 2019

Следуя видеоуроку, хост рекомендовал составные фабричные функции вместо использования функций связывания или стрелки, но я думаю, что я видел одну проблему и хотел бы знать, правильно ли я понял, вот код:

const createDragon = element => ({
  breathe() {
    return `abcd efgh ${element}`
  }
})

const newDragon = createDragon('fire');
console.log(newDragon.breathe());

является недостатком этого способа по сравнению с использованием синтаксиса класса, что объект newDragon теперь будет иметь «огонь», как его элемент навсегда, и чтобы изменить его, вам придетсясоздать новый объект?

Где, как если бы это был экземпляр класса со свойством элемента, вы могли бы просто переназначить новое значение этому свойству, я понял это хорошо?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Композиция объекта

"... объект будет иметь« огонь », установленный как элемент навсегда, и чтобы изменить его, вы быдолжны создать новый объект? "

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

В следующей демонстрации:

  • Заводская функция summonDragon() имеет объект с именем dragon, который подобен a contructor() (конечно, это не потому, что класс включает в себя прототип) в классе:

    класс:

    constructor(name) {
      this.name = name;
    } 
    

    фабрика:

    let dragon = {
      name: name
    };
    
  • Конкатенационное наследование возможно по Object.assign().У объекта powers есть методы: .breath() и .flight(), которые будут унаследованы объектом dragon.


Демо

const powers = dragon => ({
  breath: () => {
    const damage = dragon.element;
    switch (damage) {
      case 'fire':
        return `${dragon.name} breathes fire causing ${dragon.attack * 3} damage`;
      case 'ice':
        return `${dragon.name} breathes ice causing ${dragon.attack * 2} damage`;
      default:
        return;
    }
  },

  flight: () => {
    if (dragon.age >= 300) {
      return `${dragon.name} flies fast`;
    }
    if (dragon.age < 300 && dragon.age >= 150) {
      return `${dragon.name} flies average`;
    }
    if (dragon.age < 150) {
      return `${dragon.name} flies slow`;
    }
  }
});

const summonDragon = (name, age, element) => {
  let dragon = {
    name: name,
    age: age,
    element: element,
    defense: age * 10,
    attack: age * 15
  };
  return Object.assign(dragon, powers(dragon));
};

const redDragon = summonDragon('smaug', 761, 'fire');
const whiteDragon = summonDragon('fröst', 101, 'ice');
redDragon.breath();
redDragon.flight();
whiteDragon.breath();
whiteDragon.flight();

console.log(`${redDragon.name} - Attack: ${redDragon.attack}`);
console.log(`${whiteDragon.name} - Attack: ${whiteDragon.attack}`);

console.log(redDragon.flight());
console.log(whiteDragon.flight());

console.log(redDragon.breath());
console.log(whiteDragon.breath());
0 голосов
/ 24 февраля 2019

Да, используя замыкания по заводским аргументам (и не предоставляя методов установки), element по существу является константой.Этот шаблон очень подходит для создания неизменяемых объектов в функциональном программировании.Не так много для классического ООП.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...