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

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

ただいまの
回答率

88.77%

Functionクラス、Functionオブジェクト、Objectの違い

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 2,196

aaaaaaaa

score 481

javasciptの関数は、Functionクラスのが実体化したものです。つまりあらゆる関数オブジェクトは、Functionクラスを継承しています。関数の__proto__には、Function.prototypeが入っています。
Objectオブジェクトもあらゆるオブジェクトが継承しています。このFunctionクラス、とObjectオブジェクトは、何が違っていて、各々どのような用途があるのでしょうか。

また、上記のとおりFunctionクラスについては、分かりますがFunctionオブジェクトとはいったい何を指した単語なのでしょうか。Functionクラスが実体化した関数をFunctionオブジェクトと呼ぶのでしょうか。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

これが分かりやすいような気がします。


function式で生成されるオブジェクトは「Function」から生成された「Functionオブジェクト」

実はFunctionも自身から生成されたFunctionオブジェクトである

実はObjectも「Functionオブジェクト(Functionから生成されたオブジェクト)」である。

・ObjectとFunctionはいずれも__proto__プロパティがFunction.prototypeを参照している
・これはつまり、ObjectはFunctionから生成され、FunctionはFunction自身から生成されているといえる
・なので、ObjectもFunctionも、Cと同じく「Functionオブジェクト」であるといえる

や...やっと理解できた!JavaScriptのプロトタイプチェーン - maeharin log

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

 「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 さん

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

JavaScript の関数宣言をクラスと呼ぶかはちょっと微妙な話題です。
混乱させるためにもう一つ新しい情報を提示しましょう。
JavaScriptにもクラスがやってきた!JavaScriptの新しいclass構文をマスターしよう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/22 13:45

    ご回答有難うございました。
    混乱させる理由がわからないので下げておきます。

    キャンセル

  • 2016/06/22 13:52

    To: aaaaaaaaさん
    Zuishinさんの書き方は少しいじわるですが、指摘については一考されたほうが良いと思います。リンク先の内容については御覧になられましたか?

    キャンセル

  • 2016/06/22 17:31

    正誤判断がつきかねているようですが、趣旨については同意します。
    JavaScriptはプロトタイプベース言語なのでクラスベースな考え方を基盤にすると理解が遠のきます(便宜上の説明としてはクラスベースな用語も有りですが、かなり深い話をされているようなので)。
    私も先の回答でクラスベース言語として使われる「継承」という言葉を使ったのが良くなかったかもしれませんね…。
    https://teratail.com/questions/38323
    「Functionを継承する関数」を「[[Construct]] を持つオブジェクト(関数)」に持つ関数」に修正しておきました。

    キャンセル

  • 2016/06/22 18:59

    ご返答有難うございます。
    javascriptが道半ばなので精々extendが使えたりparentキーワード的なものが使えたりphpのようなクラスが使えるようになったんだ、程度の認識は、得ましたが、質問文と結びつきません。
    私の知識不足でしょうが、お伝えしたかった部分が読み取れずFunctionクラス、Functionオブジェクト、Objectの違いへの回答へ近づくどころか遠のいています。

    キャンセル

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る