質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

741閲覧

Express.js(ライブラリコード)におけるappの初期化について

hi_se_pr

総合スコア21

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2020/11/04 04:40

現在、勉強の一環としてExpress.jsのコードリーディングをし始めました。

一番最初の処理に当たる部分でいきなり躓いたので質問させていただきます。
下記のコードが該当部分です。

JavaScript

1function createApplication() { 2 3 var app = function(req, res, next) { 4 app.handle(req, res, next); // app.handleを実行する関数appを定義しただけ、? 5 }; 6 7 mixin(app, EventEmitter.prototype, false); 8 mixin(app, proto, false); 9 10 ... 11 12 app.init(); 13 return app; 14}

コードを見る限り、まずappという関数を定義して、その関数内で自身のhandleを実行すると定義されています。
この時点ではappは空であり、そのあとmixinによってプロパティが組み込まれるようになっています。

これは最初のappの定義はinterface的な使い方で、呼び出されたときにapp.handleを実行することを示しているのでしょうか?

また、初めてみた書き方なので戸惑ってしまったのですが、これはJSに詳しい人からしたら”分かりやすい”コードなのでしょうか?(一般的によく使われるような書き方でしょうか?)

<補足:mixin の実装の中身>

JavaScript

1function merge(dest, src, redefine) { 2 if (!dest) { 3 throw new TypeError('argument dest is required') 4 } 5 6 if (!src) { 7 throw new TypeError('argument src is required') 8 } 9 10 if (redefine === undefined) { 11 // Default to true 12 redefine = true 13 } 14 15 Object.getOwnPropertyNames(src).forEach(function forEachOwnPropertyName(name) { 16 if (!redefine && hasOwnProperty.call(dest, name)) { 17 // Skip desriptor 18 return 19 } 20 21 // Copy descriptor 22 var descriptor = Object.getOwnPropertyDescriptor(src, name) 23 Object.defineProperty(dest, name, descriptor) 24 }) 25 26 return dest 27} 28

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

createApplication()create と命名されているようにファクトリパターンと考えて良いです。
app という関数オブジェクトを返却している。

この時点ではappは空であり、

その**app関数は実行時に宣言された変数やメソッドを評価する**ので問題ありません。

app.handlemixin(app, proto, false); で定義されます。


ご質問では省略されていますが、app.request, app.response こそが、NodeJS のサーバーから(コールバック経由で)渡される個々の接続を意味した実装であることに着目してください(ここで、扱いやすいように拡張しています)。

※ JavaScript(ECMAScript)の特徴は インスタンスが柔軟であるために拡張可能です。
(他の言語のように変化させたくないのであれば、Object.freeze() 等で対応できますが、デメリットになることもあります)


一通りのメンバが再定義された app(関数のインスタンス)は、app.init() された状態でreturn appされます。

JSに詳しい人からしたら”分かりやすい”コードなのでしょうか? (一般的によく使われるような書き方でしょうか?)

JavaScript の仕様(特徴)を知らないと難解です。が、慣れます。(そういうコードで溢れているため)

投稿2020/11/04 08:14

編集2020/11/04 08:22
AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hi_se_pr

2020/11/04 09:45

とてもわかり易い回答ありがとうございます! デザインパターンだったりJSの仕様だったりまだまだ学ぶべきことが多そうですが、地道に習得していこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問