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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

解決済

3回答

3161閲覧

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

aaaaaaaa

総合スコア501

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

0グッド

1クリップ

投稿2016/06/21 10:58

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

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

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

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

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

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

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

guest

回答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
think49

総合スコア18164

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

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

0

ベストアンサー

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

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

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

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

・ObjectとFunctionはいずれも__proto__プロパティがFunction.prototypeを参照している

・これはつまり、ObjectはFunctionから生成され、FunctionはFunction自身から生成されているといえる
・なので、ObjectもFunctionも、Cと同じく「Functionオブジェクト」であるといえる

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

投稿2016/06/22 10:45

Lhankor_Mhy

総合スコア36115

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

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

0

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

投稿2016/06/21 11:42

Zuishin

総合スコア28660

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

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

aaaaaaaa

2016/06/22 04:45

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

2016/06/22 04:52

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

2016/06/22 08:31

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

2016/06/22 09:59

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問