回答編集履歴

3

プロトタイプベースに関して追記

2017/09/05 01:57

投稿

miyabi-sun
miyabi-sun

スコア21158

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
- 因みにRubyは完全なオブジェクト指向言語なので数値や文字列も全てオブジェクトですが、
155
+ ※Rubyは完全なオブジェクト指向言語なので数値や文字列も全てオブジェクトですが、
128
156
 
129
157
  JavaScriptも不完全ながら似たようなアプローチで、`Number, String, Boolean`等のプリミティブなもの以外はオブジェクトから派生して作られたものです。
130
158
 

2

ただのオブジェクトではないよと追記

2017/09/05 01:57

投稿

miyabi-sun
miyabi-sun

スコア21158

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に何が代入されるか追記

2017/09/05 01:33

投稿

miyabi-sun
miyabi-sun

スコア21158

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