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

回答編集履歴

3

プロトタイプチェーン

2017/09/05 10:20

投稿

think49
think49

スコア18194

answer CHANGED
@@ -45,6 +45,37 @@
45
45
  そうすることによって、`Person` の性質を持つオブジェクトを複数生成できます。
46
46
 
47
47
  - [プロトタイプ(prototype)によるJavaScriptのオブジェクト指向:CodeZine(コードジン)](http://codezine.jp/article/detail/222)
48
+
49
+ ### プロトタイプチェーン
50
+
51
+ JavaScriptではプロパティ参照の際には**必ず**、プロトタイプチェーンを辿る事でプロパティを検索します。
52
+ (`new` 演算子とセットで説明されることが多いですが、これは `new` 演算子を使った場合限定の規則ではありません)
53
+
54
+ ```JavaScript
55
+ 'use strict';
56
+ function Person (name) {
57
+ this.name = arguments.length ? name : 'no name';
58
+ }
59
+
60
+ Person.prototype.output = function output () {
61
+ console.log(this.name);
62
+ };
63
+
64
+ var taro = new Person('taro');
65
+
66
+ taro.output(); // "taro" (new Person は Person.prototype に存在するプロパティを使用できる)
67
+
68
+ console.log(taro.output === Person.prototype.output); // true (taroのプロパティを参照する時、暗黙の内に Person.prototype に存在するプロパティを検索する)
69
+ console.log(Object.getPrototypeOf(taro) === Person.prototype); // true (new Person の [[Prototype]] は Person.prototype である)
70
+ console.log(taro.__proto__ === Person.prototype); // true (同上)
71
+ ```
72
+
73
+ 注目してほしいのは、`taro.output === Person.prototype.output` が `true` となる部分です。
74
+ `taro.output` が参照された場合、`taro` は直属のプロパティとして `output` を持っていない為、prototypeである `Person.prototype` から `output` プロパティを探し、見つかった為、それを参照しているわけです。
75
+
76
+ ここでもし、`Person.prototype.output` が存在しなかったのなら、更に上の prototype を探し、prototype が存在しなくなるまでこの過程を繰り返します。
77
+ この仕組みを**プロトタイプチェーン**といいます。
78
+
48
79
  - [継承とプロトタイプチェーン - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain)
49
80
 
50
81
  Re: dada_moreo さん

2

Person -> Person\.prototype

2017/09/05 10:20

投稿

think49
think49

スコア18194

answer CHANGED
@@ -41,7 +41,7 @@
41
41
  ### プロトタイプ
42
42
 
43
43
  JavaScriptは**プロトタイプベース**の言語です。
44
- `Person` はオブジェクトの雛形(プロトタイプ)であり、`new Person` という命令によって、**Person を雛形(プロトタイプ)とするオブジェクトを生成**します。
44
+ `Person.prototype` はオブジェクトの雛形(プロトタイプ)であり、`new Person` という命令によって、**Person.prototype を雛形(プロトタイプ)とするオブジェクトを生成**します。
45
45
  そうすることによって、`Person` の性質を持つオブジェクトを複数生成できます。
46
46
 
47
47
  - [プロトタイプ(prototype)によるJavaScriptのオブジェクト指向:CodeZine(コードジン)](http://codezine.jp/article/detail/222)

1

インスタンス生成元 ≠ \[\[Prototype\]\]

2017/09/05 08:50

投稿

think49
think49

スコア18194

answer CHANGED
@@ -17,7 +17,8 @@
17
17
  |:--|:--|:--|
18
18
  |型|Object型|Object型|
19
19
  |``[[Call]]``を持っているか|持っている(関数である)|持っていない(関数ではない)|
20
+ |インスタンス生成元|`Function`|`Person`|
20
- |インスタンス生成元(`[[Prototype]]` or `__proto__`)|`Function`|`Person`|
21
+ |[[Prototype]] (`__proto__`)|`Function.prototype`|`Person.prototype`|
21
22
 
22
23
  インスタンス生成元としての「型」を「Person型」と呼ぶ場合があるわけですが、プロトタイプチェーンを辿れば、多くの型を持っている扱いとなります。
23
24