ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js の 4 つの JavaScript 概念の詳細な説明

Node.js の 4 つの JavaScript 概念の詳細な説明

黄舟
黄舟オリジナル
2017-03-10 14:46:221493ブラウズ

Node.js の 4 つの JavaScript 概念の詳細な説明

フルスタック アプリケーションを構築するために 1 つのプログラミング言語を知るだけで済むとしたら、素晴らしいと思いませんか?このアイデアを現実にするために、Ryan Dahl はnode.js を作成しました。 Node.js は、Chrome の強力な V8 JavaScript エンジン上に構築されたサーバー側フレームワークです。元々は C++ で書かれていましたが、アプリケーションは JavaScript を通じて実行されます。

このようにして、問題は解決されます。 1 つの言語ですべてを支配できます。さらに、アプリケーション全体でこの 1 つの言語を使用するだけで済みます。したがって、node.js について深く理解する必要があります。それがこの記事の内容です。

node.jsを使いこなすには、次の4つの基本概念が必要です。できるだけ短いストーリーで紹介していきます。

1. ノンブロッキングまたは非同期 I/O

Node.js はサーバー側のフレームワークであるため、その主な仕事の 1 つはブラウザーのリクエストを処理することです。従来の I/O システムでは、前のリクエストからの応答 (HTML ページ) が到着するまで、現在のリクエストは発行されません。これがブロッキング I/O と呼ばれる理由です。サーバーは現在のリクエストを処理するために他のリクエストをブロックするため、ブラウザは待機します。

Node.js は、この I/O 原則に従っていません。リクエストに時間がかかる場合、Node.js はリクエストをイベント ループに送信し、コール スタック内の次のリクエストの処理を続けます。保留中のリクエストの処理が完了すると、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 関数にメソッドを追加します。このメソッドは、別のオブジェクトをプロトタイプとして使用して新しいオブジェクトを作成し、それをパラメーターとして渡します。

新しいオブジェクトを変更しても、そのプロトタイプは影響を受けません。ただし、プロトタイプ オブジェクトに変更を加えると、その変更はそのプロトタイプに基づくすべてのオブジェクトに表示されます。

プロトタイプは複雑な概念です。これについては別の記事で詳しく説明します。

3. モジュール

Java のパッケージに触れたことがあるなら、Node.js のモジュールも例外ではありません。そうでなくても、心配する必要はありません。モジュールは、特定の目的のためのコードを含む単純な JavaScript ファイルです。モジュール パターンは、コードを簡単にナビゲートして使用できるようにするために使用されます。 module 属性を使用するには、Java クラスにパッケージをインポートするのと同じように、JavaScript ファイルでそれを要求する必要があります。

node.jsには2種類のモジュールがあります。

コア モジュール - これらのモジュールは、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 概念の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。