teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

8

なぜか/が全部\になっていた。何故だ

2019/11/03 13:18

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  1. 処理(計算)される対象であり、メモリ上(レジスタ上や概念的な場合もある)に存在する何らかのデータ
4
4
  2. オブジェクト指向におけるクラス(またはそれに相当するものの)のインスタンス
5
5
 
6
- ※ なお、コンピューター用語としてはより一般的なデータ全般の意味で使われる場合があります(DBでのオブジェクトやオブジェクトストレージ等)。参考: [Object (computer science) - Wikipedia](https:\en.wikipedia.org\wiki\Object_(computer_science))
6
+ ※ なお、コンピューター用語としてはより一般的なデータ全般の意味で使われる場合があります(DBでのオブジェクトやオブジェクトストレージ等)。参考: [Object (computer science) - Wikipedia](https://en.wikipedia.org/wiki/Object_(computer_science))
7
7
 
8
8
  より端的言うと、上のそれぞれは次のような感じで判断できる何かです。
9
9
 
@@ -22,7 +22,7 @@
22
22
 
23
23
  ### Java
24
24
 
25
- [4.3.1. Objects - Chapter 4. Types, Values, and Variables - The Java® Language Specification (Java SE 13)](https:\docs.oracle.com\javase\specs\jls\se13\html\jls-4.html#jls-4.3.1)
25
+ [4.3.1. Objects - Chapter 4. Types, Values, and Variables - The Java® Language Specification (Java SE 13)](https://docs.oracle.com/javase/specs/jls/se13/html/jls-4.html#jls-4.3.1)
26
26
 
27
27
  > An __object__ is a __class instance__ or an __array__.
28
28
 
@@ -36,12 +36,12 @@
36
36
 
37
37
  ※ JavaScriptの言語仕様はECMAScriptになります。
38
38
 
39
- [4.3.3 object - ECMAScript® 2019 Language Specification](https:\www.ecma-international.org\ecma-262\10.0\index.html#sec-terms-and-definitions-object)
39
+ [4.3.3 object - ECMAScript® 2019 Language Specification](https://www.ecma-international.org/ecma-262/10.0/index.html#sec-terms-and-definitions-object)
40
40
 
41
41
  > ###### 4.3.3 object
42
42
  > member of the type Object
43
43
 
44
- JavaScript(ECMASCript)での**オブジェクト(object)**は**Object型の一種**です(大文字小文字を厳密に区別していることに注意してください。この文章内では大文字から始まるObjectをオブジェクトと表記することはなく、そのまま英語のObjectと表記をします。オブジェクトという表現は全てobjectの事を指します)。Object型は[6.1.7 The Object Type](https:\www.ecma-international.org\ecma-262\10.0\index.html#sec-object-type)で説明があります。このObject型は0個以上のプロパティの集合体です。プロパティとは言ってしまえばキーとバリューのペアの集合であり、読み取りと書き込みができます。ただし、読み取り専用や、読み取り自体が関数呼び出しになっている特殊なプロパティも存在します。
44
+ JavaScript(ECMASCript)での**オブジェクト(object)**は**Object型の一種**です(大文字小文字を厳密に区別していることに注意してください。この文章内では大文字から始まるObjectをオブジェクトと表記することはなく、そのまま英語のObjectと表記をします。オブジェクトという表現は全てobjectの事を指します)。Object型は[6.1.7 The Object Type](https://www.ecma-international.org/ecma-262/10.0/index.html#sec-object-type)で説明があります。このObject型は0個以上のプロパティの集合体です。プロパティとは言ってしまえばキーとバリューのペアの集合であり、読み取りと書き込みができます。ただし、読み取り専用や、読み取り自体が関数呼び出しになっている特殊なプロパティも存在します。
45
45
 
46
46
  JavaScriptにおいて、組み込みおよびリテラルや`new`等で作成されたオブジェクトは何からのコンストラクター(costructor、JavaScriptのプロトタイプベースオブジェクト指向においてクラスに相当するもの)のインスタンスです。そういう意味では2.近いように見えます。しかし、`Object.create(null)`等とすると、いずれのコンストラクターのインスタンスではないオブジェクト(`x instanceof y`が`true`になる`y`が存在しない`x`)も作成できます。ですので、やはり2.と全く同じとは言えません。
47
47
 
@@ -67,7 +67,7 @@
67
67
  このように一般的に使われている場合と言語仕様における定義では厳密に異なる場合が多々あり、ここで上げていない言語でも注意が必要です。人や記事や本などによって、厳密な定義での意味で使用している場合もあれば、1.または2.の意味で使用している場合もあります。ただ、ほとんどの言語では非オブジェクト指向言語での1.またはオブジェクト指向言語での2.とその言語仕様で定義されているオブジェクトがほぼ一緒になります。微妙な違い、上で述べたもので言うと、Javaの配列やJavaScriptの`Object.create(null)`で作ったオブジェクトだけ気をつければそれほど混乱は無いかと思われます。
68
68
 
69
69
  その他、手前味噌ですが、下記の記事のオブジェクトの所も参考になるかも知れません。
70
- [オブジェクト指向が0.05%も理解できない記事 - Qiita](https:\qiita.com\raccy\items\58254f842788707f8c53#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B)
70
+ [オブジェクト指向が0.05%も理解できない記事 - Qiita](https://qiita.com/raccy/items/58254f842788707f8c53#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B)
71
71
 
72
72
  ---
73
73
 

7

文脈をちょっと修正

2019/11/03 13:18

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -83,11 +83,11 @@
83
83
 
84
84
  > Ruby では、クラスもオブジェクトと書いてあります。
85
85
 
86
- クラスの機能を実現するにあたって、Rubyでは通常のオブジェクトと同様に扱えるよう言語を設計したと言うことです。別に、クラス自体が通常のオブジェクトと同様に扱えなければならないという必然性はありません、扱ってはいけないという必然性もありません。単に、Rubyではクラスもオブジェクトとして扱えるように選択しただけです。他言語については、どちらを採用しているからはまさに様々ですので、一概に言えません。
86
+ クラスの機能を実現するにあたって、Rubyでは通常のオブジェクトと同様に扱えるよう言語を設計したと言うことです。別に、クラス自体が通常のオブジェクトと同様に扱えなければならないという必然性はありません、扱ってはいけないという必然性もありません。単に、Rubyではクラスもオブジェクトとして扱える仕様を選択しただけです。他言語については、どちらを採用しているからはまさに様々ですので、一概に言えません。
87
87
 
88
88
  > JavaScript では、関数もオブジェクトと書いてあります。
89
89
 
90
- 関数の機能を実現するにあたって、JavaScriptでは通常のオブジェクト同様に扱えるよう言語を設計したと言うことです。別に、関数自体が通常のオブジェクトと同様に扱えなければならないという必然性はありません、扱ってはいけないという必然性もありません。単に、JavaScriptでは関数もオブジェクトとして扱えるように選択しただけです。他言語については、どちらを採用しているからはまさに様々ですので、一概に言えません。
90
+ 関数の機能を実現するにあたって、JavaScriptでは通常のオブジェクト同様に扱えるよう言語を設計したと言うことです。別に、関数自体が通常のオブジェクトと同様に扱えなければならないという必然性はありません、扱ってはいけないという必然性もありません。単に、JavaScriptでは関数もオブジェクトとして扱える仕様を選択しただけです。他言語については、どちらを採用しているからはまさに様々ですので、一概に言えません。
91
91
 
92
92
  余談ですが、関数が第一級オブジェクトである(間接的ではなく直接的にオブジェクトとして扱えるという意味)ことは関数型プログラミングの書きやすさにおいて非常に重要な意味を持ちます。
93
93
 

6

誤字の修正とアラン・ケイの下りが中途半端なのを加筆

2019/11/03 13:16

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -89,11 +89,11 @@
89
89
 
90
90
  関数の機能を実現するにあたって、JavaScriptでは通常のオブジェクト同様に扱えるよう言語を設計したと言うことです。別に、関数自体が通常のオブジェクトと同様に扱えなければならないという必然性はありませんが、扱ってはいけないという必然性もありません。単に、JavaScriptでは関数もオブジェクトとして扱えるように選択しただけです。他言語については、どちらを採用しているからはまさに様々ですので、一概に言えません。
91
91
 
92
- 予断ですが、関数が第一級オブジェクトである(間接的ではなく直接的にオブジェクトとして扱えるという意味)ことは関数型プログラミングの書きやすさにおいて非常に重要な意味を持ちます。
92
+ 余談ですが、関数が第一級オブジェクトである(間接的ではなく直接的にオブジェクトとして扱えるという意味)ことは関数型プログラミングの書きやすさにおいて非常に重要な意味を持ちます。
93
93
 
94
94
  > 名前自体、「クラス指向」ではなく、「オブジェクト指向」です。
95
95
 
96
- 「オブジェクト指向(object-oriented)」という名称は、この造語を作り出したアラン・ケイ自身が後悔しているようです。中には「メッセージ指向」というべきだったという人達もいます。
96
+ 「オブジェクト指向(object-oriented)」という名称は、この造語を作り出したアラン・ケイ自身が後悔しているようです。アラン・ケイは「オブジェクト」よりも「メッセージ」が重要であると述べており、その意向に即して「メッセージ指向」というべきだったという人達もいます。いずれにしても「クラス」はオブジェクト指向の本質では無く、実装手段の一つに過ぎません。
97
97
 
98
98
  > 基となるのは「オブジェクト」で、「プロパティとメソッドを持つ実体」が定義なのでしょうか?
99
99
 

5

追記と構成の見直し

2019/11/03 13:13

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -1,26 +1,28 @@
1
- プログラミング用語として**オブジェクト(object)**は次の二つの意味で使われます。
1
+ プログラミング用語として**オブジェクト(object)**は主に次の二つの意味で使われます。
2
2
 
3
3
  1. 処理(計算)される対象であり、メモリ上(レジスタ上や概念的な場合もある)に存在する何らかのデータ
4
4
  2. オブジェクト指向におけるクラス(またはそれに相当するものの)のインスタンス
5
5
 
6
- ※ なお、コンピューター用語としてはより一般的なデータ全般の意味で使われる場合があります(DBでのオブジェクトやオブジェクトストレージ等)。参考: [Object (computer science) - Wikipedia](https://en.wikipedia.org/wiki/Object_(computer_science))
6
+ ※ なお、コンピューター用語としてはより一般的なデータ全般の意味で使われる場合があります(DBでのオブジェクトやオブジェクトストレージ等)。参考: [Object (computer science) - Wikipedia](https:\en.wikipedia.org\wiki\Object_(computer_science))
7
7
 
8
- オブジェクト指向をサポートしていない語(C, LISP, Haskell等)では1.意味で使わる場合が多く、オブジェクト指向をサポートしている言語(Java, Python, Ruby等)で2.意味で使われる場合が多いです。ただし、言語にっては規格書・仕様書で異る意味定義されてい場合があります。
8
+ より端的うと、上ぞれのよ感じ判断でき何かです。
9
9
 
10
- あらゆるインスタンスはデータでもあるため「1.⊇2.」の関係です。言語によっては「1.=2.」ですが、そうでは無い言語も数多く存在します。
11
-
12
- より端的言うと、次のような感じで判断できる何かです。
13
-
14
10
  1. 変数に代入できる(変数が束縛できる)何か
15
11
  2. `レシーバー.メソッド(引数)`のレシーバーとなり得る何か
16
12
 
17
13
  しかし、言語によっては例外があったり、厳密には異なる事もあるため、一概にこの判断に従うとは言えません。よって、必要十分条件となり得る判断方法ではありませんので、区別するときの参考情報程度に留めてください。
18
14
 
15
+ あらゆるインスタンスはデータでもあるため「1.⊇2.」の関係です(例外はたぶん無いと思われます)。言語によっては「1.=2.」ですが、そうでは無い言語も数多く存在します。
16
+
17
+ オブジェクト指向を言語仕様でサポートしていない言語(以下、非オブジェクト指向言語と言う。C, LISP, Haskell等)では1.の意味で使われる場合が多く、オブジェクト指向を言語仕様でサポートしている言語(以下、オブジェクト指向言語という。Java, Python, Ruby等)では2.の意味で使われる場合が多いです。ただし、言語によっては規格書・仕様書でより厳密に定義されている場合があります。そして、その厳密な定義でのオブジェクトは上の1.とも2.とも異なる場合があります。
18
+
19
19
  結局は言語によってバラバラですので、各言語の仕様を確認しながら、細かく見ていきます。
20
20
 
21
+ ---
22
+
21
23
  ### Java
22
24
 
23
- [4.3.1. Objects - Chapter 4. Types, Values, and Variables - The Java® Language Specification (Java SE 13)](https://docs.oracle.com/javase/specs/jls/se13/html/jls-4.html#jls-4.3.1)
25
+ [4.3.1. Objects - Chapter 4. Types, Values, and Variables - The Java® Language Specification (Java SE 13)](https:\docs.oracle.com\javase\specs\jls\se13\html\jls-4.html#jls-4.3.1)
24
26
 
25
27
  > An __object__ is a __class instance__ or an __array__.
26
28
 
@@ -34,12 +36,12 @@
34
36
 
35
37
  ※ JavaScriptの言語仕様はECMAScriptになります。
36
38
 
37
- [4.3.3 object - ECMAScript® 2019 Language Specification](https://www.ecma-international.org/ecma-262/10.0/index.html#sec-terms-and-definitions-object)
39
+ [4.3.3 object - ECMAScript® 2019 Language Specification](https:\www.ecma-international.org\ecma-262\10.0\index.html#sec-terms-and-definitions-object)
38
40
 
39
41
  > ###### 4.3.3 object
40
42
  > member of the type Object
41
43
 
42
- JavaScript(ECMASCript)での**オブジェクト(object)**は**Object型の一種**です(大文字小文字を厳密に区別していることに注意してください。この文章内では大文字から始まるObjectをオブジェクトと表記することはなく、そのまま英語のObjectと表記をします。オブジェクトという表現は全てobjectの事を指します)。Object型は[6.1.7 The Object Type](https://www.ecma-international.org/ecma-262/10.0/index.html#sec-object-type)で説明があります。このObject型は0個以上のプロパティの集合体です。プロパティとは言ってしまえばキーとバリューのペアの集合であり、読み取りと書き込みができます。ただし、読み取り専用や、読み取り自体が関数呼び出しになっている特殊なプロパティも存在します。
44
+ JavaScript(ECMASCript)での**オブジェクト(object)**は**Object型の一種**です(大文字小文字を厳密に区別していることに注意してください。この文章内では大文字から始まるObjectをオブジェクトと表記することはなく、そのまま英語のObjectと表記をします。オブジェクトという表現は全てobjectの事を指します)。Object型は[6.1.7 The Object Type](https:\www.ecma-international.org\ecma-262\10.0\index.html#sec-object-type)で説明があります。このObject型は0個以上のプロパティの集合体です。プロパティとは言ってしまえばキーとバリューのペアの集合であり、読み取りと書き込みができます。ただし、読み取り専用や、読み取り自体が関数呼び出しになっている特殊なプロパティも存在します。
43
45
 
44
46
  JavaScriptにおいて、組み込みおよびリテラルや`new`等で作成されたオブジェクトは何からのコンストラクター(costructor、JavaScriptのプロトタイプベースオブジェクト指向においてクラスに相当するもの)のインスタンスです。そういう意味では2.近いように見えます。しかし、`Object.create(null)`等とすると、いずれのコンストラクターのインスタンスではないオブジェクト(`x instanceof y`が`true`になる`y`が存在しない`x`)も作成できます。ですので、やはり2.と全く同じとは言えません。
45
47
 
@@ -62,7 +64,49 @@
62
64
 
63
65
  ---
64
66
 
65
- このように一般的に使われている場合と言語仕様における定義では厳密に異なる場合があり、言語でも注意が必要です。ただ、ほとんどの言語では最初にった1.または2.とその言語仕様で定義されているオブジェクトがほぼ一緒になります。微妙な違い、Javaの配列やJavaScriptの`Object.create(null)`で作ったオブジェクトだけ気をつければそれほど混乱は無いかと思われます。
67
+ このように一般的に使われている場合と言語仕様における定義では厳密に異なる場合が多々あり、ここで上げていない言語でも注意が必要です。人や記事や本などによって、厳密な定義での意味で使用している場合もあれば、1.まは2.の意味で使用している場合もあります。ただ、ほとんどの言語では非オブジェクト指向語での1.またはオブジェクト指向言語での2.とその言語仕様で定義されているオブジェクトがほぼ一緒になります。微妙な違い、上で述べたもので言うと、Javaの配列やJavaScriptの`Object.create(null)`で作ったオブジェクトだけ気をつければそれほど混乱は無いかと思われます。
66
68
 
67
69
  その他、手前味噌ですが、下記の記事のオブジェクトの所も参考になるかも知れません。
68
- [オブジェクト指向が0.05%も理解できない記事 - Qiita](https://qiita.com/raccy/items/58254f842788707f8c53#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B)
70
+ [オブジェクト指向が0.05%も理解できない記事 - Qiita](https:\qiita.com\raccy\items\58254f842788707f8c53#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B)
71
+
72
+ ---
73
+
74
+ 【追記】
75
+
76
+ 誤解されたままのような気がしますので、質問への直接の回答を記載します。
77
+
78
+ > Java で、オブジェクトとは「クラスから作られるもの」だと教えられました。
79
+
80
+ 仕様書で確認したとおり、Javaのオブジェクトには配列も含まれます。配列はクラスから作られるものではありません。よって、その教えた人はJavaの仕様書で定義されているオブジェクトのことではなく、別の意味のオブジェクトを指して、そのような表現をしたと考えられます。厳密なオブジェクトの定義を知りたいとしている質問者にとっては参考にしてはいけない情報です。
81
+
82
+ おそらく2.の意味で使われたと考えられますが、実際の所ではその発言をした人本人に聞かないとわかりません。
83
+
84
+ > Ruby では、クラスもオブジェクトと書いてあります。
85
+
86
+ クラスの機能を実現するにあたって、Rubyでは通常のオブジェクトと同様に扱えるよう言語を設計したと言うことです。別に、クラス自体が通常のオブジェクトと同様に扱えなければならないという必然性はありませんが、扱ってはいけないという必然性もありません。単に、Rubyではクラスもオブジェクトとして扱えるように選択しただけです。他言語については、どちらを採用しているからはまさに様々ですので、一概に言えません。
87
+
88
+ > JavaScript では、関数もオブジェクトと書いてあります。
89
+
90
+ 関数の機能を実現するにあたって、JavaScriptでは通常のオブジェクト同様に扱えるよう言語を設計したと言うことです。別に、関数自体が通常のオブジェクトと同様に扱えなければならないという必然性はありませんが、扱ってはいけないという必然性もありません。単に、JavaScriptでは関数もオブジェクトとして扱えるように選択しただけです。他言語については、どちらを採用しているからはまさに様々ですので、一概に言えません。
91
+
92
+ 予断ですが、関数が第一級オブジェクトである(間接的ではなく直接的にオブジェクトとして扱えるという意味)ことは関数型プログラミングの書きやすさにおいて非常に重要な意味を持ちます。
93
+
94
+ > 名前自体、「クラス指向」ではなく、「オブジェクト指向」です。
95
+
96
+ 「オブジェクト指向(object-oriented)」という名称は、この造語を作り出したアラン・ケイ自身が後悔しているようです。中には「メッセージ指向」というべきだったという人達もいます。
97
+
98
+ > 基となるのは「オブジェクト」で、「プロパティとメソッドを持つ実体」が定義なのでしょうか?
99
+
100
+ それはYesでもありNoでもあります。なぜなら、言語によって異なるし、「オブジェクト」という言葉が使われている文脈によって「オブジェクト」がどういう意味なのか異なるからです。
101
+
102
+ 例えば、Javaには「プロパティ」という機能は**ありません**(フィールドとプロパティは異なる機能です)。この時点でJavaへの説明は破綻します。では、Javaにあわせて「フィールドとメソッドを持つ実体」と言った場合も問題が残ります。Javaの仕様では配列もオブジェクトなのですが、配列にはフィールドもメソッドもありません(`.length`はフィールドアクセスではなく、特別な構文です)。Javaの仕様上でのオブジェクトの意味で使っていれば、Noになります。しかし、ほとんどの人達は仕様書を細かく見て居らず、上記で最初に書いた2.の意味で使っています。その意味では、Yesとなり、文脈によって異なるという話になります。
103
+
104
+ 他言語に目を向けても同じように例外があったり、逆に、まさしくそう言えたりもします。オブジェクト指向言語では、だいたいがそうと言えそうですが、プログラミングにあまり詳しくない世間一般が考えるオブジェクト指向言語の代表のようなJavaですら、上のような状況です。
105
+
106
+ 結局の所、一概に「オブジェクトとは○○である」ということは**言えません**。定義が欲しいと言いますが、「仕様上の定義は言語によって異なる」ということしか言えません。仕様の厳密な定義を無視した一般的な意味での使用する場合でも、言語や状況によって1.の意味だったり、2.の意味だったりとバラバラです。文脈等からなんとなく嗅ぎ取る以外はありません。
107
+
108
+ 最後に質問文の最初に触れておきます。
109
+
110
+ > 初歩的な事かもしれませんが、
111
+
112
+ 一つの言語についてのみ話をするのであれば、その言語では何が「オブジェクト」と言われているのかは最初に知っておくべき、初歩的なことと言って良いかもしれません。しかし、複数の言語にまたいで「オブジェクト」とは何かを考えることは全くもって初歩的なことではありません。10年以上プログラミングをやって、10個以上は言語を学んで、それでいてやっと曖昧な何か掴めたかなと思うぐらいです。私は未だにこの曖昧な何かを人にうまく説明することができていません。

4

誤字の修正

2019/11/03 13:10

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  Javaでの**オブジェクト(object)**は**クラスのインスタンス(class instance)**または**配列(array)**です。Javaの配列はクラスのインスタンスではありません。つまり、Javaでは2.に近いですが、配列が含まれるため全く同じではありません。
28
28
 
29
- なお、Javaの変数はオブジェクトを直接束縛するのではく、オブジェクトへのポインターを束縛します。このポインターと`null`という特別な値(これ自体もオブジェクトでは無い)をあわせて参照値(reference value)と呼ばれます。ただし、`null`以外に参照値を直接書く方法は存在しません。
29
+ なお、Javaの変数はオブジェクトを直接束縛するのではく、オブジェクトへのポインターを束縛します。このポインターと`null`という特別な値(これ自体もオブジェクトでは無い)をあわせて参照値(reference value)と呼ばれます。ただし、`null`以外に参照値を直接書く方法は存在しません。
30
30
 
31
31
  オブジェクトや参照値以外に1.にあたる物としてプリミティブ値(primitive value)が存在します。なお、クラスそのもの(クラスをあらわす識別子による表現されるそれ自体)はオブジェクトでは無いばかりか、1.ですありませんが、`.class`等でClassオブジェクトを取り出して、扱うことは可能です。
32
32
 

3

少し追記

2019/11/03 11:34

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -3,14 +3,21 @@
3
3
  1. 処理(計算)される対象であり、メモリ上(レジスタ上や概念的な場合もある)に存在する何らかのデータ
4
4
  2. オブジェクト指向におけるクラス(またはそれに相当するものの)のインスタンス
5
5
 
6
+ ※ なお、コンピューター用語としてはより一般的なデータ全般の意味で使われる場合があります(DBでのオブジェクトやオブジェクトストレージ等)。参考: [Object (computer science) - Wikipedia](https://en.wikipedia.org/wiki/Object_(computer_science))
7
+
6
8
  オブジェクト指向をサポートしていない言語(C, LISP, Haskell等)では1.の意味で使われる場合が多く、オブジェクト指向をサポートしている言語(Java, Python, Ruby等)では2.の意味で使われる場合が多いです。ただし、言語によっては規格書・仕様書で異なる意味で定義されている場合があります。
7
9
 
8
10
  あらゆるインスタンスはデータでもあるため「1.⊇2.」の関係です。言語によっては「1.=2.」ですが、そうでは無い言語も数多く存在します。
9
11
 
10
- なお、コンピューター用語としてはより一般なデータ全般意味使われ場合があります(DBのオブジェクトやオブジェクトストレージ等)
12
+ より言うと、次ような感じ判断でき何か
11
13
 
14
+ 1. 変数に代入できる(変数が束縛できる)何か
12
- 参考: [Object (computer science) - Wikipedia](https://en.wikipedia.org/wiki/Object_(computer_science))
15
+ 2. `レシーバー.メソッド(引数)`のレシーバーとなり得る何か
13
16
 
17
+ しかし、言語によっては例外があったり、厳密には異なる事もあるため、一概にこの判断に従うとは言えません。よって、必要十分条件となり得る判断方法ではありませんので、区別するときの参考情報程度に留めてください。
18
+
19
+ 結局は言語によってバラバラですので、各言語の仕様を確認しながら、細かく見ていきます。
20
+
14
21
  ### Java
15
22
 
16
23
  [4.3.1. Objects - Chapter 4. Types, Values, and Variables - The Java® Language Specification (Java SE 13)](https://docs.oracle.com/javase/specs/jls/se13/html/jls-4.html#jls-4.3.1)
@@ -21,9 +28,8 @@
21
28
 
22
29
  なお、Javaの変数はオブジェクトを直接束縛するのでは鳴く、オブジェクトへのポインターを束縛します。このポインターと`null`という特別な値(これ自体もオブジェクトでは無い)をあわせて参照値(reference value)と呼ばれます。ただし、`null`以外に参照値を直接書く方法は存在しません。
23
30
 
24
- オブジェクトや参照値以外に1.にあたる物としてプリミティブ値(primitive value)が存在します。なお、クラスそのもの(クラスをあらわす識別子による表現の意味)はオブジェクトでは無いばかりか、1.ですありませんが、`.class`等でClassオブジェクトを取り出して、扱うことは可能です。
31
+ オブジェクトや参照値以外に1.にあたる物としてプリミティブ値(primitive value)が存在します。なお、クラスそのもの(クラスをあらわす識別子による表現されるそれ自体)はオブジェクトでは無いばかりか、1.ですありませんが、`.class`等でClassオブジェクトを取り出して、扱うことは可能です。
25
32
 
26
-
27
33
  ### JavaScript
28
34
 
29
35
  ※ JavaScriptの言語仕様はECMAScriptになります。
@@ -33,11 +39,11 @@
33
39
  > ###### 4.3.3 object
34
40
  > member of the type Object
35
41
 
36
- JavaScript(ECMASCript)でのオブジェクト(object)はObject型のモノです(大文字小文字を厳密に区別していることに注意してください。この文章内では大文字から始まるObjectをオブジェクトと表記することはなく、そのまま英語のObjectと表記をします。オブジェクトという表現は全てobjectの事を指します)。Object型は[6.1.7 The Object Type](https://www.ecma-international.org/ecma-262/10.0/index.html#sec-object-type)で説明があります。このObject型は0個以上のプロパティの集合体です。プロパティとは言ってしまえばキーとバリューのペアの集合であり、読み取りと書き込みができます。ただし、読み取り専用や、読み取り自体が関数呼び出しになっている特殊なプロパティも存在します。
42
+ JavaScript(ECMASCript)での**オブジェクト(object)****Object型の一種**です(大文字小文字を厳密に区別していることに注意してください。この文章内では大文字から始まるObjectをオブジェクトと表記することはなく、そのまま英語のObjectと表記をします。オブジェクトという表現は全てobjectの事を指します)。Object型は[6.1.7 The Object Type](https://www.ecma-international.org/ecma-262/10.0/index.html#sec-object-type)で説明があります。このObject型は0個以上のプロパティの集合体です。プロパティとは言ってしまえばキーとバリューのペアの集合であり、読み取りと書き込みができます。ただし、読み取り専用や、読み取り自体が関数呼び出しになっている特殊なプロパティも存在します。
37
43
 
38
- JavaScriptにおけるほとんどのオブジェクトは何からのコンストラクター(costructor、JavaScriptのプロトタイプベースオブジェクト指向においてクラスに相当するもの)のインスタンスです。そういう意味では2.近いす。しかし、いずれのコンストラクターのインスタンスではないオブジェクトも作成できます(`Object.create(null)`)。ですので、やはり2.と全く同じとは言えません。
44
+ JavaScriptにおいて、組み込みおよびリテラルや`new`等で作成されたオブジェクトは何からのコンストラクター(costructor、JavaScriptのプロトタイプベースオブジェクト指向においてクラスに相当するもの)のインスタンスです。そういう意味では2.近いように見えます。しかし、`Object.create(null)`等とすると、いずれのコンストラクターのインスタンスではないオブジェクト(`x instanceof y`が`true`になる`y`が存在しない`x`)も作成できます。ですので、やはり2.と全く同じとは言えません。
39
45
 
40
- オブジェクト以外に1.に含まれるモノでプリミティブ値(`primitive value`)があります。コンストラクターもオブジェクトであり、また、関数(function)でもあります。JavaScriptのクラス構文は一種の糖衣構文であり、クラス(class)というものが内部的にあるわけではありません。
46
+ オブジェクト以外に1.に含まれるモノでプリミティブ値(primitive value)があります。コンストラクターもオブジェクトであり、また、関数(function)でもあります。JavaScriptのクラス構文は一種の糖衣構文であり、クラス(class)というものが内部的にあるわけではありません。
41
47
 
42
48
  ### Ruby
43
49
 
@@ -48,9 +54,9 @@
48
54
  > 状態及び動作をもつ計算実体。
49
55
  > **注記** オブジェクトの動作は,そのオブジェクトに対して呼び出すことができるメソッドの集合である。
50
56
 
51
- 言語仕様上は1.に近い意味で使われています。クラスのインスタンスであるとか、そういったことは定義に含まれていません。ただし、注記として、なんからのメソッドを持っているだろうと言うことだけがわかります。
57
+ Rubyの**オブジェクト**は**計算実体**です。言語仕様上は1.に近い意味で使われています。クラスのインスタンスであるとか、そういったことは定義に含まれていません。ただし、注記として、なんからのメソッドを持っているだろうと言うことだけがわかります。
52
58
 
53
- よく「Rubyは全てがオブジェクト」と言いますが、状態や動作を持たない計算実体は存在しない(他言語のような`null`や`undefind`みたいなものがない、`nil`は虚無という状態を持つし、メソッドも持つ)ため、当たり前の話とも言えます。でも本当に言いたいことは、「全てのオブジェクトはなんからのクラスのインスタンスである」ということです。つまり、「1.=2.」の関係がRubyでは成り立つと言うことです。そのため、Rubyにおいてどちらの意味でオブジェクトという言葉を使っていても、それらが指し示すものは実質同じであると言えます。
59
+ よく「Rubyは全てがオブジェクト」と言いますが、状態や動作を持たない計算実体は存在しない(他言語のような`null`や`undefind`みたいなものがない、`nil`は虚無という状態を持つし、メソッドも持つ)ため、当たり前の話とも言えます。でも本当に言いたいことは、「全てのオブジェクトはのクラスのインスタンスである」ということです。つまり、「1.=2.」の関係がRubyでは成り立つと言うことです。そのため、Rubyにおいてどちらの意味でオブジェクトという言葉を使っていても、それらが指し示すものは実質同じであると言えます。
54
60
 
55
61
  なお、クラスはオブジェクトですが、メソッドそのものはオブジェクトではありません。しかし、メソッドをオブジェクト化することはできます。
56
62
 

2

Javaのクラスについてより正確に?

2019/11/02 22:18

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -21,7 +21,7 @@
21
21
 
22
22
  なお、Javaの変数はオブジェクトを直接束縛するのでは鳴く、オブジェクトへのポインターを束縛します。このポインターと`null`という特別な値(これ自体もオブジェクトでは無い)をあわせて参照値(reference value)と呼ばれます。ただし、`null`以外に参照値を直接書く方法は存在しません。
23
23
 
24
- オブジェクトや参照値以外に1.にあたる物としてプリミティブ値(primitive value)が存在します。なお、クラスはオブジェクトでは無いばかりか、1.ですありません。
24
+ オブジェクトや参照値以外に1.にあたる物としてプリミティブ値(primitive value)が存在します。なお、クラスそのもの(クラスをあらわす識別子による表現の意味)はオブジェクトでは無いばかりか、1.ですありませんが、`.class`等でClassオブジェクトを取り出して、扱うことは可能です
25
25
 
26
26
 
27
27
  ### JavaScript

1

DB追加

2019/11/02 15:54

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -7,8 +7,10 @@
7
7
 
8
8
  あらゆるインスタンスはデータでもあるため「1.⊇2.」の関係です。言語によっては「1.=2.」ですが、そうでは無い言語も数多く存在します。
9
9
 
10
- なお、コンピューター用語としてはより一般的なデータ全般の意味で使われる場合があります(オブジェクトストレージ等)。
10
+ なお、コンピューター用語としてはより一般的なデータ全般の意味で使われる場合があります(DBでのオブジェクトやオブジェクトストレージ等)。
11
11
 
12
+ 参考: [Object (computer science) - Wikipedia](https://en.wikipedia.org/wiki/Object_(computer_science))
13
+
12
14
  ### Java
13
15
 
14
16
  [4.3.1. Objects - Chapter 4. Types, Values, and Variables - The Java® Language Specification (Java SE 13)](https://docs.oracle.com/javase/specs/jls/se13/html/jls-4.html#jls-4.3.1)