手机版

JavaScript中的工厂函数(推荐)

时间:2021-09-05 来源:互联网 编辑:宝哥软件园 浏览:

在学习jQuery的时候,我们经常会看到“工厂函数”的概念,那么“工厂函数”到底是什么呢?我们来看概念,“工厂函数意味着这些内置函数是类对象,当你调用它们时,你实际上创建了一个类实例”。这意味着当我调用这个函数时,我实际上首先用类创建一个对象,然后返回这个对象。由于Javascript本身不是严格的面向对象语言(不包括类),实际上Javascript并没有严格的“工厂函数”,但是在Javascript中,我们可以用函数来模拟类。

我们首先通过新的关键字创建了一个object,obj相当于一个Object的实例。我们通过类实例化一个对象,然后给该对象赋予相应的属性,最后返回该对象。我们可以通过调用这个函数来创建一个对象,这样工厂函数实际上就很好理解了:

1,这是一个函数。

2,用于创建对象。

3.像工厂一样,生产的功能是“标准零件”(具有相同的属性)

不学习函数和对象就不能成为JavaScript程序员,当它们一起使用时,它们就是构建块。我们需要从一个强大的叫做组合的对象范例开始。今天,我们将看看一些常见的模式,使用工厂函数来组成函数、对象和承诺。组合模式是将一批子对象组织成树形结构,一个顶层命令将操作树中的所有对象。当一个函数返回一个对象时,我们称之为工厂函数。

让我们看一个简单的例子。

函数createJelly(){ return { type : ' jelly ',color : ' red ' scoopes 3360 3 };}我们通过一些例子给大家介绍一下。

每次我们调用这个工厂函数,它都会返回一个新的果冻对象实例。需要注意的重要一点是,我们不需要在工厂函数名前面加上create,但是它可以让其他人更好地知道函数的用途。类型属性也是如此,但通常它可以帮助我们区分程序的对象。

1.带参数的工厂函数

像所有函数一样,我们可以通过参数定义我们的工厂函数(冰淇淋冰淇淋),这些参数可以用来改变返回对象的模型。

Function create冰淇淋(风味='香草'){return {type : '冰淇淋,勺子3360 3,风味}}理论上,可以使用带有数百个参数的工厂函数来返回特使的深度嵌套对象,但正如我们将看到的,这根本不是组合的本质。

2.组合工厂功能

在一个工厂功能中定义另一个工厂功能可以帮助我们将复杂的工厂功能分解成更小的、可重用的部分。

例如,我们可以创建一个甜点工厂功能,它由果冻和冰淇淋工厂功能定义。

函数create甜品(){ return { type: '甜品',bowl :[createJelly()]};}我们可以结合工厂函数来构建任何复杂的对象,这不需要我们结合new或者this。对象可以用has-a关系而不是is-a关系来表示。也就是说,可以通过组合而不是继承来实现。

例如,使用继承。

//一个松糕*就是一个*甜品蛋糕*就是*甜品功能松糕(){甜品。应用(这个,参数);}蛋糕原型=甜点原型;//或class pathy扩展了desire { constructor(){ super();}}我们可以在组合模式下表达同样的意思。

//一个蛋糕有多层果冻、蛋羹和奶油。它还有一个顶部。//蛋糕*有*果冻层、奶酪层和奶油层,顶部有*装饰成分。函数create gaughty(){ return { type : ' gaughty ',layers: [ createJelly()、createkeddesh()、createCream() ]、top :create杏仁()};} 3.异步工厂功能

并非所有工厂都会立即返回数据。比如有些必须先获取数据。在这些情况下,我们可以返回Promises来定义工厂函数。

函数getdine(menuUrl){返回新的Promise((解析,拒绝)={ fetch(menuUrl))。然后(result={ resolve({ type : ' meat ',courses : result . JSON()});}) .捕捉(拒绝);});}这种深度嵌套缩进会使异步工厂难以读取和测试。将它们分成几个不同的工厂通常是有帮助的,可以写成如下。

函数GetMenuUrl){ return fetch(MenuUrl)。然后(result=result.json())。然后(JSON=create dine(JSON));}函数create膳食(课程=[]) { return { type: '膳食',课程};}当然,我们可以使用回调函数,但是我们已经有了像Promise.all这样的工具来返回Promise来定义工厂函数。

函数getweeksmals(){ const menuUrl=' jsfood.com/';return Promise . all([GetMenuUrl(` $ { MenuUrl }/星期一`)、GetMenu(` $ { MenuUrl }/星期二`)、GetMenu(` $ { MenuUrl }/星期三`)、GetMenu(` $ { MenuUrl }/星期五`)));}我们使用get而不是create作为命名约定来显示这些工厂做一些异步工作并返回promise。

4.功能和方法

到目前为止,我们还没有看到任何工厂通过方法返回对象,这是有意的。这是因为一般来说,我们不需要这样做。工厂允许我们从计算中分离数据。这意味着我们总是可以将对象序列化到JSON中,这对于在会话之间持久化很重要,通过HTTP或WebSockets发送它们,并将它们放入数据存储中。

例如,我们可以定义一个新的函数,将一个对象作为参数,并返回修改后的版本,而不是在一个果冻对象上定义eat方法。

函数eatJelly(果冻){ if(果冻.勺子0) {果冻.勺子-=1;}返回果冻;}一点语法上的帮助,对于喜欢编程而不改变数据结构的人来说,这是一个可行的模式。对于喜欢编程而不改变数据结构的人来说,使用ES6语法是一种可行的模式。

功能吃(果冻){如果(果冻.勺子0) {返回}.果冻,勺子:果冻.勺子-1 };} else {返回果冻;}}现在,不是这样写的:

从“”导入{ createJelly }。/jelly ';createJelly()。eat();但是这样写

从“”导入{ createJelly,eatJelly }。/jelly ';eat jelly(createJelly());

最终结果是接受一个对象并返回一个对象的函数。我们称为返回对象的函数是什么?一个工厂!

5.先进的工厂

将工厂转移到更高阶的功能会给我们带来很大的控制。例如,我们可以使用这个概念来创建一个增强的对象。

函数giveTimestamp(工厂){ return(.args)={ const instance=factory(.args);const time=date . now();返回{ time,instance };};} const create order=give timestamp(函数(配料){ return { type: 'order ',配料};});这个增强的对象采用一个现有的工厂,并包装它以创建一个返回时间戳实例的工厂。或者,如果我们想确保工厂返回不可变的对象,我们可以用冰柜来增强它。

功能冰柜(工厂){退货(.参数)=对象。冻结(工厂(.args)));} const createImmutableIceCream=冷柜(createIceCream);createImmutableIceCream('草莓')。味道='薄荷';//错误!6.结论

作为一个聪明的程序员,我曾经说过:从来没有一个抽象比错误的抽象更容易回收。JavaScript项目有变得难以测试和重构的趋势,因为我们经常鼓励使用复杂的抽象层。原型和类使用复杂且不人道的工具来实现一个简单的想法,比如new和this。即使是现在,这仍然会引起各种各样的困惑——它们是几年后被添加到语言中的。对象和函数对大多数语言的程序员来说都是有意义的,而且是JavaScript中的原始类型,所以可以说工厂不是抽象的!对象和函数对于大多数背景的程序员来说都是有意义的,而且是JavaScript中的原始类型,所以可以说工厂不是抽象的!使用这些简单的构建块使我们的代码对没有经验的程序员更加友好,这绝对是我们应该关注的事情。工厂鼓励我们使用原始数据来模拟复杂和异步的数据,原始数据具有自然的组合能力,而不会强迫我们做一些高级的抽象。当我们坚持简单的时候,JavaScript更甜美!

以上是边肖介绍的JavaScript中的工厂函数。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!

版权声明:JavaScript中的工厂函数(推荐)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。