回答編集履歴
6
ネイティブ…
test
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
|
21
21
|
|
22
22
|
|
23
|
-
Objectタイプである値をオブジェクトと言うのでは無かったのか?`Object`クラスのインスタンス以外はObjectタイプじゃないのではないか?と思ったのかも知れません。いえいえ、オブジェクトと呼んでも問題ありません。なぜならプリミティブタイプを除く通常のクラスは全ては`Object`クラスを継承しているからです(ECMAScript規定外のク
|
23
|
+
Objectタイプである値をオブジェクトと言うのでは無かったのか?`Object`クラスのインスタンス以外はObjectタイプじゃないのではないか?と思ったのかも知れません。いえいえ、オブジェクトと呼んでも問題ありません。なぜならプリミティブタイプを除く通常のクラスは全ては`Object`クラスを継承しているからです(ECMAScript規定外のネイティブオブジェクトについてはその限りではありません)。`Funciton`クラスも`Array`クラスも`Object`クラスを拡張したクラスに過ぎません。なので`Function`クラスや`Array`クラスのインスタンスは、同時に、`Object`クラスのインスタンスでもあると見なすことができるのです。なので、これらをまとめて、Objectタイプとし、オブジェクトと読んでいるのです。
|
24
24
|
|
25
25
|
|
26
26
|
|
5
1\.と6\.です。
test
CHANGED
@@ -56,7 +56,7 @@
|
|
56
56
|
|
57
57
|
|
58
58
|
|
59
|
-
1.と
|
59
|
+
1.と6.以外は必ず大文字(固有名詞)で表現されます。
|
60
60
|
|
61
61
|
|
62
62
|
|
4
__proto__補足
test
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
※ JavaScriptはクラスベースではなく、プロトタイプベースです。そのため、__クラス__なるものがあるわけではありません。class構文は存在しますが、プロトタイプベースの糖衣構文に過ぎません。あるクラスのインスタンスというのは、厳密にはそれらのクラスである関数オブジェクトをコンストラクタとし、それらが持つ`prototype`を`__proto__`に設定されていることを示します。`Object`等はオブジェクトであり、コンストラクタとして使える関数であり、プロトタイプになるものなのですが、厳密な呼び方をすると複雑になるため、クラスベースのオブジェクト指向の流儀に則り、ここでは「クラス」と表現し、その「クラス」を雛形とするオブジェクトをその「クラス」の「インスタンス」と表現します。また、「直属のインスタンス」とはそのクラスを直属のプロトタイプとして持つことを示します。
|
19
|
+
※ JavaScriptはクラスベースではなく、プロトタイプベースです。そのため、__クラス__なるものがあるわけではありません。class構文は存在しますが、プロトタイプベースの糖衣構文に過ぎません。あるクラスのインスタンスというのは、厳密にはそれらのクラスである関数オブジェクトをコンストラクタとし、それらが持つ`prototype`を`__proto__`に設定されていることを示します(ES5以前の実装では`__proto__`があるとは限りません)。`Object`等はオブジェクトであり、コンストラクタとして使える関数であり、プロトタイプになるものなのですが、厳密な呼び方をすると複雑になるため、クラスベースのオブジェクト指向の流儀に則り、ここでは「クラス」と表現し、その「クラス」を雛形とするオブジェクトをその「クラス」の「インスタンス」と表現します。また、「直属のインスタンス」とはそのクラスを直属のプロトタイプとして持つことを示します。
|
20
20
|
|
21
21
|
|
22
22
|
|
3
直属についてちょっと修正
test
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
※ JavaScriptはクラスベースではなく、プロトタイプベースです。そのため、__クラス__なるものがあるわけではありません。class構文は存在しますが、プロトタイプベースの糖衣構文に過ぎません。あるクラスのインスタンスというのは、厳密にはそれらのクラスである関数オブジェクトをコンストラクタとし、それらが持つ`prototype`を`__proto__`に設定されていることを示します。`Object`等はオブジェクトであり、コンストラクタとして使える関数であり、プロトタイプ
|
19
|
+
※ JavaScriptはクラスベースではなく、プロトタイプベースです。そのため、__クラス__なるものがあるわけではありません。class構文は存在しますが、プロトタイプベースの糖衣構文に過ぎません。あるクラスのインスタンスというのは、厳密にはそれらのクラスである関数オブジェクトをコンストラクタとし、それらが持つ`prototype`を`__proto__`に設定されていることを示します。`Object`等はオブジェクトであり、コンストラクタとして使える関数であり、プロトタイプになるものなのですが、厳密な呼び方をすると複雑になるため、クラスベースのオブジェクト指向の流儀に則り、ここでは「クラス」と表現し、その「クラス」を雛形とするオブジェクトをその「クラス」の「インスタンス」と表現します。また、「直属のインスタンス」とはそのクラスを直属のプロトタイプとして持つことを示します。
|
20
20
|
|
21
21
|
|
22
22
|
|
@@ -50,7 +50,7 @@
|
|
50
50
|
|
51
51
|
4. `Object`: 3.を指すグローバルオブジェクト(global object)のプロパティ。つまり、3.のJavaScriptのコード上での**表現**です。
|
52
52
|
|
53
|
-
5. Objects: 3.を雛形とするオブジェクト。上で「`Object`クラスのインスタンス」のことです。
|
53
|
+
5. Objects: 3.を直属の雛形とするオブジェクト。上で「`Object`クラスの直属のインスタンス」のことです。
|
54
54
|
|
55
55
|
6. object initializer / object literal: 5.を作る初期化子/リテラル。
|
56
56
|
|
2
オブジェクトの内容をthink49さんのコメントを参照に改訂
test
CHANGED
@@ -8,23 +8,55 @@
|
|
8
8
|
|
9
9
|
###オブジェクト
|
10
10
|
|
11
|
-
広義ではプログラミング言語において、一つのもの、または、まとまりとして扱うことができるあらゆる値(データ)のことを指します。しかし、JavaScriptではObject
|
11
|
+
広義ではプログラミング言語において、一つのもの、または、まとまりとして扱うことができるあらゆる値(データ)のことを指します。しかし、JavaScriptでは__Objectタイプ(Object type)__である値(データ)のことを指します。以下、JavaScriptにおけるオブジェクトについて説明します。
|
12
12
|
|
13
13
|
|
14
14
|
|
15
|
-
JavaScriptには様々な値(データ)があります。`undefined`、`null`、真偽値(`true`, `false`)、数値(`1`、`3.14`等)、シンボル(`Symbol('abc')`等)、文字列(`'abc'`等)はプリミティブ値と言われ、オブジェクトではありません。
|
15
|
+
JavaScriptには様々な値(データ)があります。`undefined`、`null`、真偽値(`true`, `false`)、数値(`1`、`3.14`等)、シンボル(`Symbol('abc')`等)、文字列(`'abc'`等)はプリミティブタイプの値で、プリミティブ値と言われ、オブジェクトではありません。それ以外の、例えば、Object(`{a: 0}`等)、関数(`function(x){return x;}`等)、配列(`[0, 1]`等)はそれぞれ、`Object`クラス、`Function`クラス、`Array`クラスのインスタンスであるオブジェクトです。
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
|
19
|
+
※ JavaScriptはクラスベースではなく、プロトタイプベースです。そのため、__クラス__なるものがあるわけではありません。class構文は存在しますが、プロトタイプベースの糖衣構文に過ぎません。あるクラスのインスタンスというのは、厳密にはそれらのクラスである関数オブジェクトをコンストラクタとし、それらが持つ`prototype`を`__proto__`に設定されていることを示します。`Object`等はオブジェクトであり、コンストラクタとして使える関数であり、プロトタイプを持つものなのですが、厳密な呼び方をすると複雑になるため、クラスベースのオブジェクト指向の流儀に則り、ここでは「クラス」と表現し、その「クラス」を雛形とするオブジェクトをその「クラス」の「インスタンス」と表現します。
|
20
20
|
|
21
21
|
|
22
22
|
|
23
|
-
|
23
|
+
Objectタイプである値をオブジェクトと言うのでは無かったのか?`Object`クラスのインスタンス以外はObjectタイプじゃないのではないか?と思ったのかも知れません。いえいえ、オブジェクトと呼んでも問題ありません。なぜならプリミティブタイプを除く通常のクラスは全ては`Object`クラスを継承しているからです(ECMAScript規定外のクラスについてはその限りではありません)。`Funciton`クラスも`Array`クラスも`Object`クラスを拡張したクラスに過ぎません。なので`Function`クラスや`Array`クラスのインスタンスは、同時に、`Object`クラスのインスタンスでもあると見なすことができるのです。なので、これらをまとめて、Objectタイプとし、オブジェクトと読んでいるのです。
|
24
24
|
|
25
25
|
|
26
26
|
|
27
|
-
|
27
|
+
※ `Object.create()`等で作成したconstructorを持たないオブジェクトなど、例外的なオブジェクトも存在します。これらは`Object`クラスのインスタンスではありませんが、Objectタイプであるためオブジェクトです。
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
jQueryも同じです。jQureyライブラリを使うと`jQuery`クラスというクラスが追加されます(`jQuery`は関数でもあります)。これも`Object`クラスを継承しています。`jQurey`クラスのオブジェクトは`$('.abc')`等の書き方で作成できますが、これも`Object`クラスのインスタンスとして性質を持っています。このような`jQuery`クラスのオブジェクトを「**jQueryオブジェクト**」と呼ぶ場合があります。「オブジェクト=jQueryオブジェクト」では決してありませんが、文脈によっては単に「オブジェクト」と言っている場合があるので注意が必要です(そのような書き方をしている書籍やサイトは、著者の知識が足りずにそのように言っている場合がありますので、参考にしないことをお勧めします)。
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
なお、`Object`クラスの直属のインスタンス(`{}`や`{a: 1}`等)を単に「オブジェクト」と呼んでいるJavaScriptの書籍やサイトもあります。英語ではこのような「`Object`クラスのオブジェクト」のことを"Objects"(大文字、固有名詞扱い)と表現し、オブジェクトを"objects"(小文字、一般名詞扱い)と表現して分けているのですが、**そのまま直訳してしまった**場合が多いです。原書がある場合は、原書を参考にした方がいいでしょう。(この文章ではこの種類のオブジェクトを単にObjectと表現し、`Object`クラスそのものをさすオブジェクトは`Object`と分けて表現しています。)
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
####補足
|
40
|
+
|
41
|
+
非常にややこしいことに、JavaScriptでは「オブジェクト(object/Object)」と呼ばれるものが複数存在します。
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
1. objects: 値(データ)の一種であるオブジェクト。
|
46
|
+
|
47
|
+
2. Object type: Objectタイプ(Object型)というtype(型)の一つ。他のtypeは全てプリミティブタイプです。ここでのtypeはJavaScript特有の定義があるため、注意が必要です。一般的な型とは異なりますし、TypeScriptの型とも一致しません。
|
48
|
+
|
49
|
+
3. Object constructor / Object objects: "Object"という名前(内部的には%Object%という名前)の組み込みオブジェクト(コンストラクタ)。Object(`{}`等)のコンストラクタになる関数であり、プロトタイプです。また、Object自身がいくつかのプロパティを持ちます。上で「`Object`クラス」と言っているそのクラスそのもの事です。
|
50
|
+
|
51
|
+
4. `Object`: 3.を指すグローバルオブジェクト(global object)のプロパティ。つまり、3.のJavaScriptのコード上での**表現**です。
|
52
|
+
|
53
|
+
5. Objects: 3.を雛形とするオブジェクト。上で「`Object`クラスのインスタンス」のことです。
|
54
|
+
|
55
|
+
6. object initializer / object literal: 5.を作る初期化子/リテラル。
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
1.と5.以外は必ず大文字(固有名詞)で表現されます。
|
28
60
|
|
29
61
|
|
30
62
|
|
@@ -114,7 +146,7 @@
|
|
114
146
|
|
115
147
|
|
116
148
|
|
117
|
-
`{'color':'red'}`という表現は、名前が`'color'`、値が`'red'`というプロパティを持つObject
|
149
|
+
`{'color':'red'}`という表現は、名前が`'color'`、値が`'red'`というプロパティを持つObjectのリテラル表現であり、そのObjectを生成しているだけに過ぎません。
|
118
150
|
|
119
151
|
|
120
152
|
|
1
コードの指摘部分修正
test
CHANGED
@@ -102,7 +102,7 @@
|
|
102
102
|
|
103
103
|
str: 'abc', // 文字列
|
104
104
|
|
105
|
-
ary: [0, 'abc], // 配列
|
105
|
+
ary: [0, 'abc'], // 配列
|
106
106
|
|
107
107
|
fun: function(x) { return x * 2; }, // 関数も入る
|
108
108
|
|