回答編集履歴

1

具体例を追加

2017/09/04 23:53

投稿

unau
unau

スコア2468

test CHANGED
@@ -7,3 +7,109 @@
7
7
 
8
8
 
9
9
  `new person()` でオブジェクトを生成するメリットは、`person` 型の prototype にメソッド (たとえば、`walk()`) を追加すると、そのメソッドの実体が一つでも、生成したオブジェクト、たとえば `me` から `me.walk()` のように `me` 自体のメソッドのように呼べること、などです。
10
+
11
+
12
+
13
+ ---
14
+
15
+ コメントを受けて追記
16
+
17
+
18
+
19
+ - `person` は `function` という型のインスタンスです。
20
+
21
+ - `me` は `person` という型のインスタンスです。
22
+
23
+
24
+
25
+ もうちょっと詳しく書くと、
26
+
27
+
28
+
29
+ - `person` は `function` という型のインスタンスです。関数オブジェクトとも言います。関数オブジェクトは型となれます。
30
+
31
+ - `me` は `person` という変数に格納された関数オブジェクトを型としたときのインスタンスです。
32
+
33
+
34
+
35
+ という感じです。
36
+
37
+
38
+
39
+ 例を示しながら。
40
+
41
+
42
+
43
+ ```js
44
+
45
+ var person = function() {
46
+
47
+ this.name = "no name";
48
+
49
+ }
50
+
51
+
52
+
53
+ var me = new person();
54
+
55
+ var he = new person();
56
+
57
+ var it = new person();
58
+
59
+
60
+
61
+ person.prototype.setName = function(name) {
62
+
63
+ this.name = name;
64
+
65
+ return this;
66
+
67
+ };
68
+
69
+
70
+
71
+ person.prototype.isHuman = true;
72
+
73
+
74
+
75
+ person.prototype.greet = function() {
76
+
77
+ console.log("my name is " + this.name + " (" + (this.isHuman ? "human" : "?")\
78
+
79
+ + ").");
80
+
81
+ };
82
+
83
+
84
+
85
+ me.bark = function() {
86
+
87
+ console.log(this.name + "!!!");
88
+
89
+ };
90
+
91
+
92
+
93
+ it.isHuman = false;
94
+
95
+
96
+
97
+ me.setName("Taro").greet(); //-> my name is Taro (human).
98
+
99
+ he.setName("Jiro").greet(); //-> my name is Jiro (human).
100
+
101
+ it.greet(); //-> my name is no name (?).
102
+
103
+ me.bark(); //-> Taro!!!
104
+
105
+ he.bark(); //-> エラー発生 (he.bark is not a function)
106
+
107
+ ```
108
+
109
+
110
+
111
+ `person` 型のオブジェクト `me`, `he`, `it` を生成しました。`me` にはオブジェクト固有のメソッド `bark()` が定義してあります。`it` には固有のプロパティ `isHuman` が定義してあります。これらは、オブジェクトごとに記憶領域を持っているわけです。
112
+
113
+
114
+
115
+ 一方で、`setName()` メソッドや `greet()` メソッド、そして `isHuman` プロパティについては、`person` という型のほうに定義してあります。これらは `person` 型の記憶領域に保存されているので、`person` 型のインスタンスをいくら生成しても、これらの分の記憶領域は消費されません。