所谓工厂函数,就是这些内置函数是类对象。当您调用它们时,您实际上创建了一个类实例。本文主要介绍JavaScript工厂函数,有需要的朋友可以参考一下。
在学习jQuery的时候,我们经常会看到“工厂函数”这个概念,那么到底什么是“工厂函数”呢?让我们来看看这个概念。“所谓工厂函数,就是这些内置函数是类对象。当你调用它们时,你实际上创建了一个类实例”。这意味着当我调用这个函数时,我实际上是先用类创建一个对象,然后返回这个对象。由于Javascript本身并不是严格的面向对象语言(不包括类),实际上Javascript并没有严格的“工厂函数”,但是在Javascript中,我们可以用函数来模拟类。
首先,我们通过new关键字创建一个对象,obj相当于该对象的一个实例。我们通过类实例化一个对象,然后赋予它相应的属性,最后返回对象。我们可以通过调用这个函数来创建一个对象。在这种情况下,工厂功能实际上很容易理解:
1,这是一个函数。
2,用来创建对象。
3.像工厂一样,“生产”出来的功能是“标准件”(具有相同的属性)。
不学习函数和对象是做不了JavaScript程序员的,当它们一起使用时,就是积木。我们需要从一个叫做复合的强大的对象范例开始。今天,让我们看看一些惯用模式,使用工厂函数来组合函数、对象和承诺。组合模式是将一组子对象组织成一个树形结构,一个顶层命令将操作树中的所有对象。当一个函数返回一个对象时,我们称之为工厂函数。
让我们看一个简单的例子。
函数createJelly() {
返回{
类型:“果冻”,
颜色:“红色”
独家新闻:3
};
}
下面通过一些例子给大家介绍一下。
每次我们调用这个工厂函数,都会返回一个jelly对象的新实例。需要注意的重要一点是,我们不必在工厂函数名前加上create前缀,但这可以让其他人更清楚该函数的意图。type属性也是如此,但通常它可以帮助我们区分程序的对象。
1.带参数的工厂函数
像所有的函数一样,我们可以通过参数定义我们的工厂函数(icecream冰淇淋),它可以用来改变返回对象的模型。
函数create ice cream(flavor=' Vanilla '){
返回{
类型:“冰淇淋”,
勺子:3,
风味
}
}
理论上,你可以使用带有数百个参数的工厂函数来返回深度嵌套的特使对象,但正如我们将看到的,这根本不是复合的本质。
2.组合的工厂函数
在一个工厂函数中定义另一个工厂函数可以帮助我们将复杂的工厂函数分割成更小的、可重用的部分。
例如,我们可以创建一个甜点(dessert)工厂函数,它是由前面的果冻(jelly)和冰淇淋(icecream)工厂函数定义的。
函数createDessert() {
返回{
类型:“甜点”,
碗:[
createJelly(),
createIceCream()
]
};
}
我们可以组合工厂函数来构建任意复杂的对象,这不需要我们组合new或者this。对象可以用has-a(有)关系代替is-a(有)来表示。即可以通过组合而不是继承来实现。
例如,使用继承。
//一个蛋糕*是一个*甜点蛋糕*是的*甜点
函数diffuse(){
甜品.应用(这个,论据);
}
松糕.原型=甜点.原型;
//或者
蛋糕类延伸甜点{
构造函数(){
super();
}
}
我们可以用组合方式表达同样的意思。
//蛋糕有多层果冻、奶油冻和奶油。它也有一个浇头。
//蛋糕*有*果冻层,奶酪层,奶油层,上面还有*装饰配料。
函数create jabbly(){
返回{
类型:'蛋糕',
图层:[
createJelly(),
createCustard(),
createCream()
],
浇头:创建杏仁()
};
}
3.异步的工厂函数
不是所有的工厂都会立即返回数据。比如有的必须先拿到数据。在这些情况下,我们可以返回定义工厂功能的承诺。
函数getMeal(menuUrl) {
返回新承诺((解决,拒绝)={
获取(菜单Url)。然后(结果={
解决({
类型:“膳食”,
课程:result.json()
});
})。捕捉(拒绝);
});
}
这种深度嵌套的缩进将使异步工厂难以读取和测试。将它们分解成许多不同的工厂通常是有帮助的,这些工厂可以用下面的代码编写。
函数getMeal(menuUrl) {
返回获取(菜单Url)。then(result=result.json())。然后(JSON=create meal(JSON));
}
函数createMeal(courses=[]) {
返回{
类型:“膳食”,
课程
};
}
当然,我们可以使用回调函数,但我们已经有了一个像Promise.all这样的工具来返回承诺以定义工厂函数。
函数getWeeksMeals() {
const menuUrl=' js food . com/';
返回Promise.all([
getMeal(`${menuUrl}/monday `),
getMeal(`${menuUrl}/tuesday `),
getMeal(` $ { menuUrl }/星期三`),
getMeal(`${menuUrl}/thursday `),
getMeal(`${menuUrl}/friday `)
]);
}
我们使用get而不是create作为命名约定,以表明这些工厂执行一些异步工作并返回承诺。
4.函数和方法
到目前为止,我们还没有看到任何工厂用方法返回对象,这是有意的。这是因为一般来说,我们不需要这样做。工厂允许我们将数据从计算中分离出来。这意味着我们总是可以将对象序列化到JSON中,这对会话之间的持久性很重要,通过HTTP或WebSockets发送它们,并将其放入数据存储中。
例如,我们可以不在jelly(果冻)对象上定义eat方法,而是定义一个新的函数,该函数将一个对象作为参数并返回一个修改后的版本。
功能果冻(果冻){
if(jelly.scoops 0) {
jelly . scoops-=1;
}
回力果冻;
}
对于那些喜欢编程而不改变数据结构的人来说,一点语法有助于使它成为一个可行的模型。对于那些喜欢编程而不改变数据结构的人,使用ES6的.语法是一种可行的模式。
功能性食品(果冻){
if(jelly.scoops 0) {
返回{.果冻,勺子:jelly . scoops-1 };
}否则{
回力果冻;
}
}
现在,它不是这样写的:
从'导入{ createJelly }。/果冻';
createJelly()。吃();
但是这样写。
从'导入{ createJelly,eatJelly }。/果冻';
eat jelly(create jelly());
最终结果是一个接受对象并返回对象的函数。我们称之为返回对象的函数是什么?一个工厂!
5.高级工厂
把工厂传递给高阶函数会给我们带来很大的控制力。例如,我们可以使用这个概念来创建一个增强的对象。
函数给定时间戳(工厂){
返回(.args)={
常量实例=工厂(.args);
const time=date . now();
返回{时间,实例};
};
}
const createOrder=giveTimestamp(函数(成分){
返回{
类型:“订单”,
佐料
};
});
这个增强的对象获取一个现有的工厂,并包装它以创建一个返回时间戳实例的工厂。或者,如果我们想确保一个工厂返回不可变的对象,我们可以用freezer来增强它。
功能冰箱(工厂){
返回(.args)=Object.freeze(factory(.args)));
}
const createImmutableIceCream=冷冻器(createIceCream);
createImmutableIceCream('草莓')。flavour=' mint//错误!
6.结论
正如一个聪明的程序员曾经说过的:没有比错误的抽象更容易回收的了。JavaScript项目有变得难以测试和重构的趋势,因为我们经常鼓励使用复杂的抽象层。原型和类使用复杂和不人道的工具实现一个简单的想法,比如new和this。即使是现在,这仍然会引起各种各样的混淆——它们是在几年后被添加到语言中的。而对象函数对于大多数语言背景的程序员来说都是有意义的,在JavaScript中都是原语类型,所以可以说工厂并不抽象!而对象函数对于大多数背景的程序员来说都是有意义的,而且都是JavaScript中的原语类型,所以可以说工厂并不抽象!使用这些简单的构建模块使我们的代码对没有经验的程序员更友好,这绝对是我们应该关心的事情。工厂鼓励我们使用原始数据来模拟复杂的异步数据。原始数据具有天然的组合能力,无需强迫我们做一些高级的抽象。JavaScript在我们坚持简单的时候更甜!
以上是边肖介绍的JavaScript中的工厂函数。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。