Node.js新手必須知道的4個JavaScript概念

2015-12-26    分類:WEB開發、程式設計開發、首頁精華3人評論發表於2015-12-26

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

如果只需要知道一種程式語言就可以構建一個全棧的應用程式,是不是特別了不起?Ryan Dahl為了把這個想法成為現實,創造了node.js。Node.js是建立在Chrome強勁的V8 JavaScript引擎上的伺服器端框架。雖然最初是用C++編寫的,但是應用程式通過JavaScript執行。

這樣一來,問題就解決了。一種語言就可以統治一切。而且,在整個應用程式中你只需要使用這一種語言。所以,我們需要深刻了解node.js。這就是本文的主題。

下面這四個基本概念是你想要掌握node.js所必需的。我會盡可能長話短說向大家介紹它們。

1.非阻塞或非同步I/O

由於Node.js是一種伺服器端框架,所以它的一個主要工作就是處理瀏覽器請求。在傳統的I/O系統中,當前請求只有當先前請求的響應(HTML頁面)已到達才會發出。這就是為什麼它被稱為阻塞I/O。伺服器阻塞其他請求是為了處理當前的請求,而這會導致瀏覽器的等待。

Node.js不遵循I/O的這個原則。如果一個請求需要花費較長時間,那麼Node.js會傳送請求到事件迴圈(event loop)中,並繼續在呼叫棧(call stack)中處理下一個請求。一旦未決請求完成處理,它就會告訴Node.js,並將響應渲染在瀏覽器上。

用一個虛擬的例子來理解這一點:

阻塞I / O

// take order for table 1 and wait...
var order1 = orderBlocking(['Coke', 'Iced Tea']);
// once order is ready, take order back to table.
serveOrder(order1);
// once order is delivered, move on to another table.
// take order for table 2 and wait...
var order2 = orderBlocking(['Coke', 'Water']);
// once order is ready, take order back to table.
serveOrder(order2);
// once order is delivered, move on to another table.
// take order for table 3 and wait...
var order3 = orderBlocking(['Iced Tea', 'Water']);
// once order is ready, take order back to table.
serveOrder(order3);
// once order is delivered, move on to another table.

在這個餐廳例子中,服務員給出選單,等待訂單完成,然後再回到餐桌根據選單上菜。在當前客戶點菜時,服務員就在旁邊等待,不接受其他客戶的選單。

非阻塞I / O

// take order for table 1 and move on...
orderNonBlocking(['Coke', 'Iced Tea'], function(drinks){
  return serveOrder(drinks);
});
// take order for table 2 and move on...
orderNonBlocking(['Beer', 'Whiskey'], function(drinks){
  return serveOrder(drinks);
});
// take order for table 3 and move on...
orderNonBlocking(['Hamburger', 'Pizza'], function(food){
  return serveOrder(food);
});

在這個例子中,服務員獲得選單,並告知廚師,然後返回取另一份選單。在完成第一個選單程式中,他既按照順序給當前顧客上菜,也接受來自其他客戶的點單。服務員不會因為阻塞來自於其他客戶的點菜而浪費時間。

2.原型

原型是JavaScript的一個複雜概念。不過因為在Node.js中你要多次用到原型,所以每個JavaScript開發人員都必須瞭解這個概念。

在實現經典繼承的語言中,例如Java,或C ++,對於以程式碼重用為目的的語言,你首先必須寫一個類,然後從該類建立物件或擴充套件該類。但是,在JavaScript中不存在類的概念。首先在JavaScript中建立一個物件,然後從這個物件中增加自己的物件,或建立新的物件。這就是所謂的原型傳承和通過原型的實現。

每個JavaScript物件被連結到一個來自於它可以繼承屬性的原型物件。原型類似其他OO語言中的類,但不同的是,它們本身也是物件。每一個物件都連結到Object.prototype,而Object.prototype自帶JavaScript預定義。

如果你通過obj.propName或 obj['propName'] 查詢屬性,而物件並不具有可通過 obj.hasOwnProperty(‘propName’)被檢查的屬性,那麼JavaScript的執行時會在其原型物件中查詢屬性。如果原型物件也沒有這樣的屬性,那麼依次檢查它的原型,直到找到匹配,或者到達Object.prototype。如果該屬性不存在原型鏈,那麼它會導致一個未定義的值。

通過下面的示例程式碼來理解這個概念:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        var F = function () {};
        F.prototype = o;
        return new F();
    };
var otherPerson = Object.create(person);

當你建立一個新物件的時候,你必須選擇一個應該是它的原型的物件。這裡,我們新增了一個方法到Object  function。該方法建立了一個使用另一個物件作為其原型的新物件,而原型作為引數傳遞給它。

當我們改變新物件的時候,它的原型不受影響。但是,當我們進行改變原型物件的時候,這些變化在所有基於該原型的物件上可見。

原型是一個複雜的概念。我將在另一篇文章中詳細說明。

3.模組

如果你曾經接觸過Java中的包,那麼Node.js中的模組也沒有什麼不同。如果沒有,那麼也不用擔心。模組是包含特定目的程式碼的簡單的JavaScript檔案。模組模式用來使你的程式碼易於導航和使用。要使用模組屬性,你需要在JavaScript檔案中需求它,很像在Java類中匯入包。

node.js中有兩種型別的模組。

核心模組——這些模組是用Node.js庫預編譯過的。核心模組的目的是提供開發者經常發生和重複的程式碼段,這些程式碼段如果不可用的話,會導致開發者陷入不得不一次又一次地寫相同程式碼的處境。一些常見的核心模組是HTTP,URL,EVENTS,FILE SYSTEM,等等。

使用者定義模組——使用者定義模組是開發人員在應用程式內建立用於特定目的的模組。當核心模組不能滿足期望功能的時候就需要使用者定義模組。

模組通過require函式提取。如果它是一個核心模組,那麼引數僅僅是模組的名稱。如果它是一個使用者自定義模組,那麼引數就是該模組在檔案系統中的路徑。例如:

// extract a core module like this
var http = require('http);
// extract a user defined module like this
var something = require('./folder1/folder2/folder3/something.js');

4.回撥函式

在JavaScript中,函式被認為是第一類物件。這意味著你可以對這些函式做所有可對常規物件做的操作。你可以賦值函式給變數,作為引數傳遞函式給方法,作為物件屬性宣告函式,甚至從函式返回函式。

回撥函式是JavaScript中的匿名函式,它可以作為引數傳遞給其他函式,要麼被執行或返回自函式稍後執行。這是回撥函式——這個使用最廣的函式程式設計正規化的基礎。

當我們將回撥函式作為引數傳遞給另一個函式的時候,我們只能傳遞函式定義……換言之就是,我們不知道這個回撥函式什麼時候會執行。這完全取決於呼叫函式的機制。它會在以後的某個時間點“回撥”,因此而得名。這也是非阻塞或Node.js非同步行為的唯一基礎,如下例所示。

setTimeout(function() {
    console.log("world");
}, 2000)
console.log("hello");

這是回撥函式最簡單的例子之一。我們將一個匿名函式作為一個引數傳遞,這個引數只需在控制檯上記錄一些輸出到setTimeout函式。它是唯一的函式定義,但是不知道何時執行。這需要經過2秒後,通過第二個引數,呼叫setTimeout函式來決定。

首先,第二個日誌語句記錄輸出到控制檯,然後,2秒鐘後,回撥函式中的日誌語句記錄輸出。

// output
hello
world

上面這些就是Node.js新手必須知道的4個最重要的 JavaScript概念。你的看法呢?希望大家能夠暢所欲言!

譯文連結:http://www.codeceo.com/article/nodejs-4-javascript-concepts.html
英文原文:Top 4 JavaScript Concepts a Node.js Beginner Must Know
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章