回答編集履歴
3
プロトタイプベースに関して追記
test
CHANGED
@@ -5,12 +5,6 @@
|
|
5
5
|
いいえ、これは関数です※
|
6
6
|
|
7
7
|
ただし、`new`を使ってインスタンスを作ることを想定した関数です。
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
> 1行目で宣言したpersonがオブジェクトだとすると、下部で new person(); とオブジェクトを生成する意味は何でしょうか?
|
12
|
-
|
13
|
-
オブジェクトではない場合、person の型は何でしょうか?
|
14
8
|
|
15
9
|
|
16
10
|
|
@@ -124,7 +118,41 @@
|
|
124
118
|
|
125
119
|
|
126
120
|
|
121
|
+
> 1行目で宣言したpersonがオブジェクトだとすると、下部で new person(); とオブジェクトを生成する意味は何でしょうか?
|
122
|
+
|
123
|
+
オブジェクトではない場合、person の型は何でしょうか?
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
JavaScriptはプロトタイプベースのオブジェクト指向言語という話を聞いたことありませんか?
|
128
|
+
|
129
|
+
(その気になれば)全ての関数をnewして新しいインスタンスを生成することが可能です。
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
現実的にはthisに値を突っ込むコンストラクタメソッド的な関数しかプロトタイプの元には成りえないので、
|
134
|
+
|
135
|
+
雛形に相当する関数を予め作っておく(プロトタイプ)、それを元に新しいインスタンスを生成する(new)
|
136
|
+
|
137
|
+
正にコピーを作りながら量産するという考え方になります。
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
継承の代わりになるのがプロトタイプのコピー及び改良。
|
142
|
+
|
143
|
+
ちょっとしたコードを買いて見せたかったけど、ちゃんとした書き方は大変なので参考サイト張っておきます。
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
参考サイト:[継承とプロトタイプチェーン - MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain)
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
---
|
152
|
+
|
153
|
+
|
154
|
+
|
127
|
-
※
|
155
|
+
※Rubyは完全なオブジェクト指向言語なので数値や文字列も全てオブジェクトですが、
|
128
156
|
|
129
157
|
JavaScriptも不完全ながら似たようなアプローチで、`Number, String, Boolean`等のプリミティブなもの以外はオブジェクトから派生して作られたものです。
|
130
158
|
|
2
ただのオブジェクトではないよと追記
test
CHANGED
@@ -54,6 +54,46 @@
|
|
54
54
|
|
55
55
|
}
|
56
56
|
|
57
|
+
|
58
|
+
|
59
|
+
var me = new person();
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
console.log(me);
|
64
|
+
|
65
|
+
// person {name: "hogehoge"}
|
66
|
+
|
67
|
+
```
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
---
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
newを使って作られたオブジェクトはただのオブジェクトではなく、
|
76
|
+
|
77
|
+
関数である`person`のインスタンスとして動作するオブジェクトになります。
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
`console.log`で中身を表示するとちゃんと`person`のインスタンスって表示されることが確認出来ます。
|
82
|
+
|
83
|
+
ついでに定義しておいたpersonのメソッド(プロトタイプのプロパティ)にアクセスできます。
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
```JavaScript
|
88
|
+
|
89
|
+
var person = function() {
|
90
|
+
|
91
|
+
this.name = "hogehoge";
|
92
|
+
|
93
|
+
}
|
94
|
+
|
95
|
+
// これがメソッド定義
|
96
|
+
|
57
97
|
person.prototype.hello = function() {
|
58
98
|
|
59
99
|
return "hello. my name is " + this.name;
|
1
meに何が代入されるか追記
test
CHANGED
@@ -23,6 +23,16 @@
|
|
23
23
|
関数内部で`this.hoge = 123;`という風に`this`に向かってプロパティを詰めていくと、
|
24
24
|
|
25
25
|
newで作られた空のオブジェクトのプロパティに値が詰め込まれていきます。
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
そして、ここが重要!
|
30
|
+
|
31
|
+
newを使って関数が実行されると、最初に作ったオブジェクトだったものが戻り値として帰ってきます。
|
32
|
+
|
33
|
+
関数内の`return`じゃないよ!
|
34
|
+
|
35
|
+
要するに変数`me`は`new person()`と指定するから、必ずオブジェクトが代入されるってわけ。
|
26
36
|
|
27
37
|
|
28
38
|
|