經常會遇到工廠函數這個詞,不過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
