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