質問: javasciptの関数は、Functionクラスのが実体化したものです。つまりあらゆる関数オブジェクトは、Functionクラスを継承しています。関数の`__proto__`には、Function.prototypeが入っています。 Objectオブジェクトもあらゆるオブジェクトが継承しています。このFunctionクラス、とObjectオブジェクトは、何が違っていて、各々どのような用途があるのでしょうか。 また、上記のとおりFunctionクラスについては、分かりますがFunctionオブジェクトとはいったい何を指した単語なのでしょうか。Functionクラスが実体化した関数をFunctionオブジェクトと呼ぶのでしょうか。
回答: ### 「Functionクラス」と「Functionオブジェクト」 まず、一番気になるのは私から見れば、「Functionクラス」と「Functionオブジェクト」の違いがないように読める事です。 aaaaaaaa さんが認識する「Functionクラス」と「Functionオブジェクト」が分からないのでとても回答しづらい状況になっていますが、どのように認識されているでしょうか。 ``` /** * aaaaaaaa さんにとって、 これは「Function クラス」? * それとも、「Function オブジェクト」? **/ function A () {} /** * aaaaaaaa さんにとって、 これは「Functionクラス」? * それとも、「Function オブジェクト」? **/ Function; ``` 大文字で始まるビルトイン関数は(基本的に)関数なので**「Functionクラス」と「Functionオブジェクト」はどちらも Function を指している**と私は考えます。 ``` /** * これは「コンストラクタ A」であり、関数オブジェクトである * これは「Function クラス」でも「Function オブジェクト」でもない **/ function A () {} /** * これは「Function オブジェクト」であり、「関数オブジェクト」でもある * これはクラスベース言語的にみれば「Function クラス」である(便宜上の言葉であり、厳密ではない) **/ Function; ``` 手元の『パーフェクトJavaScript』を読んでみましたが、「Functionクラス」と「Functionオブジェクト」はどちらも `Function` を指しているように読めました。 クラス(コンストラクタ)としての性質を強調したい場合に「Functionクラス」と表現しているようです。 厳密な用語に拘るなら「Functionコンストラクタ」と呼ぶのが好ましいと私は思います。 ### 書籍『パーフェクトJavaScript』 『パーフェクトJavaScript』は私も所持していたので改めて読みましたが、用語定義の観点からいえば好ましくないと評価せざるを得ません。 * 関数宣言文 (関数宣言は文ではない) * 関数リテラル式 (関数にリテラルはなく、それは関数式) * new式 (式の一種だが、「new演算子」が正) * オブジェクトリテラル式 (式の一種だが、「オブジェクト初期化子」が正) * null 型 (Null 型が正、型の名称は大文字で始まる) 「~文」と「~式」で分類しようとしているのは読み取れますが、「関数リテラル式」に至っては「new演算子式」と書かれたような気持ち悪さを感じます。 これらは理解している人にとっては頭の中で用語を脳内変換すれば済む部分であり、大した問題ではないともいえます。 しかしながら、用語定義に事細かく拘る aaaaaaaa さんには向いてない書籍だと私は思います。 ### 問題を細分化して一つ一つ解決する ここからはお節介です。 おそらく、aaaaaaaa さんは問題に対してわからない要素がいくつもある状態で質問されていると思うのですが、その状態で理解を進めるのは非常に厳しいと思います。 なぜなら、わからない箇所が多岐にわたっている為に回答を貰っても「前提となる基礎知識が間違っている」為に間違った方向に解釈してしまう可能性が高いからです。 質問するときのヒント|teratail(テラテイル) から引用しますが、 > > 大切なのは一度にすべてを解決しようとしないことです。わからないことを一つずつ解決していきましょう。 > > > これがとても重要です。 例えば、**私が質問する場合には問題解決のための要素が全体で10あったとしたら、その内の「9」を理解し、残りの「1」が分からない状態で質問します**。 そうすることで誤った解釈をする可能性を低くする事が出来ます。 それから**言葉での説明に頼らず、コードを書く**方が良いです。 質問する場合には aaaaaaaa さんの認識する「「Functionクラス」、「Functionオブジェクト」をコードで書き表してください。 そうすることで仮に用語理解が誤っていたとしても、コードを読み取る事で質問者と回答者の間で問題点の認識が一致します。 ### 全体としては 失礼ながら、aaaaaaaa さんはもう少し、基礎的な知識を付ける必要があるように思います。 * 書籍を読んだなら、その書籍のコードを納得がいくまで書いて試行錯誤を繰り返しているでしょうか。 * 用語が理解できないなら、その用語が出てくる章の説明を読み返しているでしょうか。 * 説明が難しいと感じたのなら、もっと平易な入門向けの書籍を読んでみたでしょうか。 細かな点が気になるのはプログラマの美徳だと思います。 しかし、それは前提となる基礎知識が身についてから読み解かなければ、勇み足になってしまいます。 遠回りに感じるかもしれませんが、基礎からコツコツと学んでいく事も大切だと思います。 Re: aaaaaaaa さん