javasciptの関数は、Functionクラスのが実体化したものです。つまりあらゆる関数オブジェクトは、Functionクラスを継承しています。関数の__proto__
には、Function.prototypeが入っています。
Objectオブジェクトもあらゆるオブジェクトが継承しています。このFunctionクラス、とObjectオブジェクトは、何が違っていて、各々どのような用途があるのでしょうか。
また、上記のとおりFunctionクラスについては、分かりますがFunctionオブジェクトとはいったい何を指した単語なのでしょうか。Functionクラスが実体化した関数をFunctionオブジェクトと呼ぶのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
「Functionクラス」と「Functionオブジェクト」
まず、一番気になるのは私から見れば、「Functionクラス」と「Functionオブジェクト」の違いがないように読める事です。
aaaaaaaa さんが認識する「Functionクラス」と「Functionオブジェクト」が分からないのでとても回答しづらい状況になっていますが、どのように認識されているでしょうか。
JavaScript
1/** 2 * aaaaaaaa さんにとって、 これは「Function クラス」? 3 * それとも、「Function オブジェクト」? 4 **/ 5function A () {} 6 7/** 8 * aaaaaaaa さんにとって、 これは「Functionクラス」? 9 * それとも、「Function オブジェクト」? 10 **/ 11Function;
大文字で始まるビルトイン関数は(基本的に)関数なので**「Functionクラス」と「Functionオブジェクト」はどちらも Function を指している**と私は考えます。
JavaScript
1/** 2 * これは「コンストラクタ A」であり、関数オブジェクトである 3 * これは「Function クラス」でも「Function オブジェクト」でもない 4 **/ 5function A () {} 6 7/** 8 * これは「Function オブジェクト」であり、「関数オブジェクト」でもある 9 * これはクラスベース言語的にみれば「Function クラス」である(便宜上の言葉であり、厳密ではない) 10 **/ 11Function;
手元の『パーフェクト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 さん
投稿2016/06/22 12:11
編集2016/06/22 12:19総合スコア18164
0
ベストアンサー
これが分かりやすいような気がします。
function式で生成されるオブジェクトは「Function」から生成された「Functionオブジェクト」
実はFunctionも自身から生成されたFunctionオブジェクトである
実はObjectも「Functionオブジェクト(Functionから生成されたオブジェクト)」である。
・ObjectとFunctionはいずれも
__proto__
プロパティがFunction.prototypeを参照している
・これはつまり、ObjectはFunctionから生成され、FunctionはFunction自身から生成されているといえる
・なので、ObjectもFunctionも、Cと同じく「Functionオブジェクト」であるといえる
投稿2016/06/22 10:45
総合スコア36115
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
JavaScript の関数宣言をクラスと呼ぶかはちょっと微妙な話題です。
混乱させるためにもう一つ新しい情報を提示しましょう。
JavaScriptにもクラスがやってきた!JavaScriptの新しいclass構文をマスターしよう
投稿2016/06/21 11:42
総合スコア28660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/22 04:52
2016/06/22 08:31
2016/06/22 09:59
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。