久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      JavaScript工廠函數(shù)是什么

      在JavaScript中,工廠函數(shù)是用于創(chuàng)建對(duì)象的一個(gè)函數(shù)。這些內(nèi)建函數(shù)都是類對(duì)象,調(diào)用時(shí)實(shí)際上是創(chuàng)建了一個(gè)類實(shí)例,也就是先利用類創(chuàng)建一個(gè)對(duì)象,然后返回這個(gè)對(duì)象,創(chuàng)建的函數(shù)都擁有相同的屬性。

      JavaScript工廠函數(shù)是什么

      本教程操作環(huán)境:windows10系統(tǒng)、javascript1.8.5版、Dell G3電腦。

      JavaScript工廠函數(shù)是什么

      那么究竟什么是“工廠函數(shù)”呢?我們來看看概念,“所謂工廠函數(shù),就是指這些內(nèi)建函數(shù)都是類對(duì)象,當(dāng)你調(diào)用他們時(shí),實(shí)際上是創(chuàng)建了一個(gè)類實(shí)例”。意思就是當(dāng)我調(diào)用這個(gè)函數(shù),實(shí)際上是先利用類創(chuàng)建了一個(gè)對(duì)象,然后返回這個(gè)對(duì)象。由于Javascript本身不是嚴(yán)格的面向?qū)ο蟮恼Z(yǔ)言(不包含類),實(shí)際上來說,Javascript并沒有嚴(yán)格的“工廠函數(shù)”,但是在Javascript中,我們能利用函數(shù)模擬類。

      我們首先通過new關(guān)鍵字創(chuàng)建了一個(gè)對(duì)象,obj就相當(dāng)于Object的實(shí)例。我們通過類實(shí)例化了一個(gè)對(duì)象,然后給這個(gè)對(duì)象相應(yīng)的屬性,最后返回對(duì)象。我們可以通過調(diào)用這個(gè)函數(shù)來創(chuàng)建對(duì)象,這樣的話,實(shí)際上工廠函數(shù)也很好理解了:

      1,它是一個(gè)函數(shù)。

      2,它用來創(chuàng)建對(duì)象。

      3,它像工廠一樣,“生產(chǎn)”出來的函數(shù)都是“標(biāo)準(zhǔn)件”(擁有同樣的屬性)

      不學(xué)習(xí)函數(shù)和對(duì)象,你不可能成為一名JavaScript程序員,并且當(dāng)他們一起使用時(shí),是構(gòu)建塊,我們需要從一個(gè)稱為 組合(composition) 的強(qiáng)大對(duì)象范例開始。今天我們來看一些慣用的模式,使用工廠函數(shù)來組成函數(shù),對(duì)象和 Promises 。組合模式是將一批子對(duì)象組織為樹形結(jié)構(gòu),一條頂層的命令會(huì)在操作樹中所有的對(duì)象。當(dāng)一個(gè)函數(shù)返回一個(gè)對(duì)象時(shí),我們稱之他為 工廠函數(shù)(factory function) 。

      讓我們來看一個(gè)簡(jiǎn)單的例子。

      function createJelly() {  return {  type: 'jelly',  colour: 'red'  scoops: 3  };  }

      下面我們通過一些實(shí)例給大家介紹。

      每次我們調(diào)用這個(gè)工廠函數(shù),它將返回一個(gè)新的 jelly(果凍) 對(duì)象實(shí)例。要注意的重點(diǎn)是,我們不必在工廠函數(shù)名稱前面加上 create ,但它可以讓其他人更清楚函數(shù)的意圖。對(duì)于 type 屬性也是如此,但通常它可以幫助我們區(qū)分我們程序的對(duì)象。

      1.帶參數(shù)的工廠函數(shù)

      像所有函數(shù)一樣,我們可以通過參數(shù)來定義我們的工廠函數(shù) (icecream 冰淇淋),這可以用來改變返回對(duì)象的模型。

      function createIceCream(flavour='Vanilla') {  return {  type: 'icecream',  scoops: 3,  flavour  }  }

      理論上,您可以使用帶有數(shù)百個(gè)參數(shù)的工廠函數(shù)來返回非常特使的深層嵌套對(duì)象,但正如我們將看到的,這根本不是組合的精髓。

      2.組合的工廠函數(shù)

      在一個(gè)工廠函數(shù)中定義另一個(gè)工廠函數(shù),可以幫助我們把復(fù)雜的工廠函數(shù)拆分成更小的,可重用的碎片。

      例如,我們可以創(chuàng)建一個(gè) dessert(甜點(diǎn))工廠函數(shù),通過前面的 jelly(果凍)和 icecream(冰淇淋)工廠函數(shù)來定義。

      function createDessert() { return { type: 'dessert', bowl: [ createJelly(), createIceCream() ] }; }

      我們可以組合工廠函數(shù)來構(gòu)建任意復(fù)雜的對(duì)象,這不需要我們結(jié)合使用 new 或 this 。對(duì)象可以用 has-a (具有) 關(guān)系而不是 is-a (是) 來表示。也就是說,可以用組合而不是繼承來實(shí)現(xiàn)。

      例如,使用繼承。

      // A trifle *is a* dessert 蛋糕*是*甜點(diǎn) function Trifle() { Dessert.apply(this, arguments); } Trifle.prototype = Dessert.prototype; // 或者 class Trifle extends Dessert { constructor() { super(); } }

      我們可以用組合模式表達(dá)相同的意思。

      // A trifle *has* layers of jelly, custard and cream. It also *has a* topping. // 蛋糕 *有* 果凍層,奶酪層和奶油層,頂部還 *有* 裝飾配料。 function createTrifle() { return { type: 'trifle', layers: [ createJelly(), createCustard(), createCream() ], topping: createAlmonds() }; }

      3.異步的工廠函數(shù)

      并非所有工廠都會(huì)立即返回?cái)?shù)據(jù)。例如,有些必須先獲取數(shù)據(jù)。在這些情況下,我們可以返回 Promises 來定義工廠函數(shù)。

      function getMeal(menuUrl) {  return new Promise((resolve, reject) => {  fetch(menuUrl)  .then(result => {  resolve({  type: 'meal',  courses: result.json()  });  })  .catch(reject);  });  }

      這種深度嵌套的縮進(jìn)會(huì)使異步工廠難以閱讀和測(cè)試。將它們分解成多個(gè)不同的工廠通常是有幫助的,可以使用如下編寫。

      function getMeal(menuUrl) {  return fetch(menuUrl)  .then(result => result.json())  .then(json => createMeal(json));  }  function createMeal(courses=[]) {  return {  type: 'meal',  courses  };  }

      當(dāng)然,我們可以使用回調(diào)函數(shù),但是我們已經(jīng)有了 Promise.all 這樣的工具返回 Promises 來定義工廠函數(shù)。

      function getWeeksMeals() { const menuUrl = 'jsfood.com/'; return Promise.all([ getMeal(`${menuUrl}/monday`), getMeal(`${menuUrl}/tuesday`), getMeal(`${menuUrl}/wednesday`), getMeal(`${menuUrl}/thursday`), getMeal(`${menuUrl}/friday`) ]); }

      我們使用 get 而不是 create 作為命名約定來顯示這些工廠做一些異步工作和返回promise。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)