js工厂函数

经常会遇到工厂函数这个词,不过javascript不是严格的面向对象语言,不像java,C#拥有类,所以工厂函数会变得比较模糊。

简单来讲,就是创建一个可以用来创建实例的函数,这样每一个实例都是独立的,互不影响

如:

 1 function Cat () {
 2   return {
 3         // 具体内容由实际业务定义,如工厂一样
 4         type: 'cat',
 5         color: 'blacK'
 6     }  
 7 }
 8 
 9 
10 const catOne = new Cat()
11 const catTwo = new Cat()
12 // 上诉两者实际都是黑猫,内容都是一样,但是互不影响

由于是函数,所以可以增加参数,来优化这个工厂

如:

 1 function cat(color='red') {
 2     return {
 3         type: 'cat',
 4         color
 5     }
 6 }
 7 
 8 // 上述是一个带默认参数值的工厂函数
 9 
10 // 实例
11 const redCat = new Cat()
12 const yellowCat = new Cat('yellow')

由于实际情况不同,如动物和猫的关系,你可能需要一个动物的工厂函数,但是又不想书写太多的代码,此时可以组合我们的工厂函数

 1 function Animal () {
 2     return {
 3         type: 'animal',
 4         // kinds是种类
 5         kinds: [
 6             Cat()
 7             // Dog()
 8         ]
 9     }
10 } 
11 
12 // 所以相当于声明动物时候,动物的具体类型也跟着声明 
13 const animal = new Animal()

还有几种情况,如异步执行的工厂函数,这在实际业务中会比较常用到,比如获取后在执行,这里可以使用Promise

 1 // 这里使用axios来获取数据
 2 function getCity (listUrl) {
 3     return new Promise ((resovle, reject) => {
 4         axios.get(listUrl).then(result => {
 5             resovle({
 6                 error: '1',
 7                 data: result.json()
 8             })
 9         }).catch(reject) // 否则直接抛出异常
10     })
11 }

谢谢!

作者:一个热爱改BUG的猴子——310672315@qq.com

以梦为马
原文地址:https://www.cnblogs.com/lsAxy/p/12674761.html