经常会遇到工厂函数这个词,不过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