是否可以使用 2 个工厂函数来填充 1 个实例?
Is it possible to use 2 factory functions to populate 1 instance?
使用单个 factory function 填充实例非常简单。在下面的示例中,我使用工厂函数 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>
我试过像这样将它们链接在一起,但它抛出了一个错误。
未捕获类型错误:aircraftFactory(...).engines 不是函数
let supermarine = aircraftFactory({manufacturer: 'Supermarine', factory: 'Southampton'}).engines({numberOfEngines: 1, costPerEngine: 35000});
我知道一定有一个模式,但我找不到示例或弄清楚。感谢您的帮助!
我想我有一个建议给你:
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;
}
要将 engines
扩展到 aircraftFactory
,您需要使用 prototype
Prototypes extends/inherit your properties and methods.
试试这个
"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});
使用单个 factory function 填充实例非常简单。在下面的示例中,我使用工厂函数 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>
我试过像这样将它们链接在一起,但它抛出了一个错误。
未捕获类型错误:aircraftFactory(...).engines 不是函数
let supermarine = aircraftFactory({manufacturer: 'Supermarine', factory: 'Southampton'}).engines({numberOfEngines: 1, costPerEngine: 35000});
我知道一定有一个模式,但我找不到示例或弄清楚。感谢您的帮助!
我想我有一个建议给你:
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;
}
要将 engines
扩展到 aircraftFactory
,您需要使用 prototype
Prototypes extends/inherit your properties and methods.
试试这个
"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});