Можно ли использовать 2 заводские функции для заполнения 1 экземпляра? - PullRequest
0 голосов
/ 28 апреля 2018

Использовать одну фабричную функцию для заполнения экземпляра просто. В приведенном ниже примере я использую фабричную функцию aircraftFactory() для создания нового экземпляра с именем supermarine. Однако я не уверен, как структурировать это так, чтобы и aircraftFactory(), и engines() могли использоваться вместе для создания supermarine.

"use strict"

function aircraftFactory(x) {
    return {
        manufacturer: x.manufacturer,
        factory: x.factory
    }
}

function engines(x) {
    return {
        numberOfEngines: x.numberOfEngines,
        costPerEngine: x.costPerEngine
    }
}

let supermarine = aircraftFactory({manufacturer: 'Supermarine', factory: 'Southampton'});

document.querySelector('.output').textContent = supermarine.manufacturer;
<div class='output'></div>

Я пытался объединить их в цепочку, но это привело к ошибке.

Uncaught TypeError: aircraftFactory (...). Двигатели не работают

let supermarine = aircraftFactory({manufacturer: 'Supermarine', factory: 'Southampton'}).engines({numberOfEngines: 1, costPerEngine: 35000});

Я знаю, что должен быть образец, но я не могу найти пример или понять его. Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Чтобы расширить engines до aircraftFactory, вам нужно использовать prototype

Прототипы расширяет / наследует ваши свойства и методы.

Попробуйте это

"use strict"

function aircraftFactory(x) {
  this.manufacturer = x.manufacturer;
  this.factory = x.factory;
}

function engines(x) {
    return {
        numberOfEngines: x.numberOfEngines,
        costPerEngine: x.costPerEngine
    }
}

//This is where you extend engines
aircraftFactory.prototype.engines = engines;

//Create the instance of aircraftFactory
let supermarine = new aircraftFactory({manufacturer: 'Supermarine', factory: 'Southampton'}).engines({numberOfEngines: 1, costPerEngine: 35000});
0 голосов
/ 28 апреля 2018

Я думаю, у меня есть для вас предложение:

function engines(x) {
    return {
        numberOfEngines: x.numberOfEngines,
        costPerEngine: x.costPerEngine
    }
}

Если вы передаете двигатель:

function aircraftFactory(x, engine) {
    let aircraft = {
        manufacturer: x.manufacturer,
        factory: x.factory
    };

    if (engine) {
      aircraft.numberOfEngines = engine.numberOfEngines;
      aircraft.costPerEngine = engine.costPerEngine;
    }

    return aircraft;
}

Вы можете создать экземпляр следующим образом:

let aircraft = aicraftFactory(x, engineFactory(y));

Но если вы хотите создать свойства, не зная имен:

function aircraftFactory(x, extended) {
    let aircraft = {
        manufacturer: x.manufacturer,
        factory: x.factory
    };

    if (engine) {
        for (let key in extended) {
            aircraft[key] = extended[key];
        }
    }

    return aircraft;
}
...