當前位置:
首頁 > 知識 > Node.js開發者必須了解的4個JS要點

Node.js開發者必須了解的4個JS要點

Node.js開發者必須了解的4個JS要點



Node.js是一個面向伺服器的框架,立足於Chrome強大的V8 JS引擎。儘管它由C++編寫而成,但是它及其應用是運行在JS上的。本文為開發者總結了4個Node.js要點。


1. 非阻塞(Non-blocking)或非同步I/O


由於Node.js一個伺服器端框架,所以它主要工作之一是處理瀏覽器請求。在傳統的I/O系統中,每個請求的發出都是在上一請求到達之後才發出的。所以這被稱為阻塞(blocking)I/O。伺服器會阻擋其它的請求以處理當前請求,從而導致瀏覽器等待。

Node.js不以這種方式來進行I/O處理。如果一個請求需要長時間處理,Node.js會把該請求發送給一個事件循環(event loop),然後繼續處理在調用堆棧(call stack)中的下一請求。當延後請求處理完畢時,它會告知Node.js同時瀏覽器會做出響應反饋。


以下使用一個事例來說明。


Blocking I/O


[js]


view plain


copy


// take order for table 1 and wait...


varorder1 = 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...


varorder2 = 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...


varorder3 = orderBlocking([ Iced Tea , Water ]);


// once order is ready, take order back to table.


serveOrder(order3);

// once order is delivered, move on to another table.


在這個餐館例子中,服務員接收了菜單指令,等待飯菜處理,然後在飯菜處理完成後把飯菜端到桌子上。在服務員等候飯菜處理期間,他會拒絕其它客人的菜單指令。


Non-blocking I/O


[js]


view plain


copy


// take order for table 1 and move on...


orderNonBlocking([ Coke , Iced Tea ],function(drinks){


returnserveOrder(drinks);


});

// take order for table 2 and move on...


orderNonBlocking([ Beer , Whiskey ],function(drinks){


returnserveOrder(drinks);


});


// take order for table 3 and move on...


orderNonBlocking([ Hamburger , Pizza ],function(food){


returnserveOrder(food);


});


而在非阻塞模式下,服務員會告知廚師他接受到的菜單指令,然後去接收下一桌的指令。當第一桌飯菜處理完畢時,他會為那桌客人上菜,然後繼續接收其它客人的指令。這樣一來服務員不會由於阻塞指令而造成時間浪費。


2. 原型(Prototype)

原型在JS中是一個複雜的概念。在典型繼承機制語言如Java或C++中,為了實現代碼復用,你必須先創建一個類然後透過它來生成對象或透過類擴展來生成對象。但是在JS中沒有類似的類概念。在JS中創建一個對象後,你需要透過它來擴展對象或創建新對象。這就叫做原型繼承(prototypal inheritence)。


每個JS對象都連接著一個原型對象並對並繼承該對象的屬性。每個對象與預定義JS的Object.prototype相聯繫。如果你透過obj.propName或obj[ propName >方式來查找對象屬性但查找失敗時,這時可嘗試通過obj.hasOwnProperty( propName )的方式進行查找,JS運行時會在在原型對象中查找屬性。如果屬性不存在於原型鏈中,那麼將返回undefined值。


讓我們用以下例子來進行說明:


[js]


view plain


copy


if(typeofObject.create !== function ) {


Object.create =function(o) {


varF =function() {};


F.prototype = o;

returnnewF();


};


varotherPerson = Object.create(person);


當你創建了一個新對象,你必須選定一個以原型為基礎的對象。在這裡,我們為對象函數添加了一個create方法。create方法創建了一個以其它對象為原型的對象,並作為參數傳入。


當我們變更新的對象時,它的原型是保持不變的。但是,當我們改動了原型對象,該變更會影響所有基於該原型的對象。


3. 組件(Modules)


如果你曾在Java中使用過包,那麼Node.js的組件與之類似。如果沒有,也不用擔心;組件其實是簡單的JS文件,用於實現特定的功能。組件模式的意義是讓你工作得更加輕鬆。要使用組件,你必須像在JAVA中導入包一樣進行JS文件導入。Node.js中有兩種組件


核心組件(Core Modules)- 核心組件是結合Node.js庫被預編譯的。其目的是把程序員經常使用的功能開放出來,避免重複勞動。常見的核心組件有HTTP, URL, EVENTS, FILE SYSTEM等等。


用戶自定義組件(UserDefined Modules)- 用戶自定義組件是提供給用戶使用以實現具體功能的組件。當核心組件不足以滿足程序員需要的時候,自定義組件就可派上用場了。


組件是通過require函數被抽取的。如果這是一個核心組件,那麼參數就是組件名。如果這是一個用戶自定義組件,那麼參數就是其在文件系統中的組件路徑。例如:

[js]


view plain


copy


// extract a core module like this


varhttp = require( http);


// extract a user defined module like this


varsomething = require( ./folder1/folder2/folder3/something.js );


4. 回調(Callbacks)


在JS中,函數是第一類對象。也就是說你可以像對常規對象那樣對函數進行所有操作。例如指派函數到一個變數,把這些作為參數傳給方法,把它們聲明為對象的屬性,甚至是把它們從函數里返回。


回調在JS中是非同步函數,可以作為參數傳遞給其它函數或從其它函數里執行或返回而後再執行。這是回調的基本概念。

當我們把一個回調函數作為參數傳遞給另外的函數時,我們傳遞的僅僅是函數的定義;換言之,我們不會知道回調函數的執行時間。這完全依賴於回調函數機制。它會在稍後某個時間點進行回調調用。這是Node.js的非阻塞或非同步行為的基本概念,可用下例進行說明:


[js]


view plain


copy


setTimeout(function() {


console.log("world");


}, 2000)


console.log("hello");


這是一個最簡單的調用。我們把一個匿名函數作為參數進行傳遞,作用是為setTimeout函數進行控制台的輸出記錄登記。因為這僅僅是個函數定義,我們不知道函數何時會被執行。這取決於setTimeout函數的second參數,即2S後。


首先,second記錄語句記錄了對控制台的輸出,2S後,在回調函數中的記錄語句記錄了輸出的內容。

[js]


view plain


copy


// output


hello


world


寫在最後


以上4點對Node.js開發者來說是要徹底理解和掌握的,建議多動手來好好體會這4個要點的含義。


最近熱文:


1、邀你參加11期 程序員專場相親活動


2、PHP高工/架構師,18-50K,深圳南山


3、JAVA/Web前端,深圳前海,15-30K


4、如何判斷是否到了該辭職的時候?


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序源 的精彩文章:

一行代碼完成並行任務
從零開始的 Python 爬蟲速成指南

TAG:程序源 |

您可能感興趣

web開發者的最愛—Node.js
Node.js對於Java開發者而言是什麼?
WebView開發React.js遇到的問題和解決方案
Facebook要進入中國了?!據說他們開發了一個"過濾"工具...
Jony Ive:iPhone X 開發用了 5 年
10款超好用的JavaScript工具,web開發者不容錯過
厲害了:開發者解鎖了iPhone的NFC功能
Android 8.0 Oreo 開發者常見問題
iOS 11開發者Beta到來後 需要注意些什麼
Kotlin在Android 開發中的 16 個建議
Google 的 Android Instant Apps 已向所有開發者開放
蘋果發布macOS High Sierra開發者Beta 9
iOS開發者收入超700億 那Android呢?
Keras 2.0.7 版發布,諸多改進將強化TensorFlow的開發能力
新iPhone命名被開發者曝光,要直接跳過iPhone 7s?
蘋果開發者大會今晚直播,你所期待的iPhone SE 2和10.5寸iPad會來嗎?
Nature:Jennifer A.Doudna再一次開發新的CRISPR系統
我所看到的 Unity 開發者大會 | Unite 2017
iOS多線程開發之NSOperation-快上車,沒時間解釋了!