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

回答編集履歴

1

追記

2019/12/06 21:31

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

answer CHANGED
@@ -78,4 +78,54 @@
78
78
 
79
79
  ですので、長い前置きの通り、トレードオフとなる特徴から、しっかり選ぶ必要があるということです。
80
80
 
81
- ※MDN上級者向けのページは、コードを書いた経験、読んだ経験を積んで読み直すと、理解が変わります。
81
+ ※MDN上級者向けのページは、コードを書いた経験、読んだ経験を積んで読み直すと、理解が変わります。
82
+
83
+ # 追記)
84
+ > まさか, Bがaを持っている場合に, Cのプロパティも列挙されるわけではないですよね?
85
+
86
+ MDNに
87
+ > 加えて、**存在しないプロパティへのアクセスは**、常にプロトタイプチェーン全体を通過します。
88
+
89
+ と条件を示している通り、**プロパティが見つかった時点でサーチは終了します。**
90
+ (これが、ご質問の本質であり、求める回答でしょうか?)
91
+
92
+ ----
93
+ 継承を行った時は、この特徴が関連してきます。
94
+
95
+ 1) オブジェクトAの定義
96
+ * ``class A {}``
97
+ * ``A[[Prototype]].method``
98
+
99
+ 2) Aから派生したオブジェクトBの定義
100
+ * ``class B extends A {}``
101
+ * ``B[[Prototype]].method``
102
+
103
+ AにもBにも同じ名称のmethodがある場合、B のインスタンス bでは、親Aの持つ同名のmethodを参照しません。
104
+
105
+ Bのmethodで参照する必要がある場合、
106
+ 1. 古典的実装
107
+ ```javascript
108
+ B.prototype.method = function() {
109
+ // A.prototype に定義されたメンバと明示して、call()/apply()で利用
110
+ return A.prototype.method.call(this) * 10
111
+ }
112
+ ```
113
+ 2.Classブロック(シンタックスシュガー)
114
+ ```javascript
115
+ class B extends A {
116
+ /* omitted */
117
+ method () {
118
+ // 親を参照するための インタックスシュガー super が使える。
119
+ return super.method() * 10
120
+ }
121
+ }
122
+ ```
123
+
124
+ ----
125
+ 質問では「とあるオブジェクト」のような身勝手な想像上の表現では分かりづらいです。
126
+ __リファレンスにも記述される様式__ で具体的な定義を示したり、箇条書きにすると、回答もしやすい。
127
+ また、インスタンスもオブジェクトに違いないのですが、区別したほうが伝わりやすいです。
128
+ 1. オブジェクト=抽象化の定義
129
+ 2. インスタンス=具象化したオブジェクト
130
+
131
+ とにかく、少しでも理解が深まれば幸いです。