「JavaScriptの基礎 - 継承とプロトタイプ」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の1版が非表示)
169行目: 169行目:
<br>
<br>
# オブジェクト自身のプロパティを探索する。
# オブジェクト自身のプロパティを探索する。
# 見つからない場合、<code>[[Prototype]]</code> (プロトタイプ) のプロパティを探索する。
# 見つからない場合、<code><nowiki>[[Prototype]]</nowiki></code> (プロトタイプ) のプロパティを探索する。
# 見つからない場合、プロトタイプのプロトタイプを探索する。
# 見つからない場合、プロトタイプのプロトタイプを探索する。
# <code>null</code> に到達しても見つからない場合、<u>undefined</u> を返す。
# <code>null</code> に到達しても見つからない場合、<u>undefined</u> を返す。
203行目: 203行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== classとプロトタイプの関係 ====
==== classとプロトタイプの関係 ====
<code>class</code> 構文はシンタックスシュガーであり、内部的にはプロトタイプベースの継承を使用している。<br>
<code>class</code> 構文はシンタックスシュガーであり、内部的にはプロトタイプベースの継承を使用している。<br>
250行目: 251行目:
! class構文 !! プロトタイプベースの等価コード !! 説明
! class構文 !! プロトタイプベースの等価コード !! 説明
|-
|-
| <u>class Animal {}</u> || <u>function Animal() {}</u> || クラス宣言はコンストラクタ関数に対応する
| class Animal {} || function Animal() {} || クラス宣言はコンストラクタ関数に対応する。
|-
|-
| <u>constructor(name) { this.name = name; }</u> || <u>function Animal(name) { this.name = name; }</u> || コンストラクタ本体はそのまま関数本体になる
| constructor(name) { this.name = name; } || function Animal(name) { this.name = name; } || コンストラクタ本体はそのまま関数本体になる。
|-
|-
| <u>speak() { ... }</u> || <u>Animal.prototype.speak = function() { ... };</u> || インスタンスメソッドはprototypeに追加される
| speak() { ... } || Animal.prototype.speak = function() { ... }; || インスタンスメソッドは <u>prototype</u> に追加される。
|-
|-
| <u>static create() { ... }</u> || <u>Animal.create = function() { ... };</u> || 静的メソッドはコンストラクタ関数自体のプロパティになる
| static create() { ... } || Animal.create = function() { ... }; || 静的メソッドはコンストラクタ関数自体のプロパティになる。
|-
|-
| <u>class Dog extends Animal</u> || <u>Object.setPrototypeOf(Dog.prototype, Animal.prototype);</u> || extendsはプロトタイプチェーンを設定する
| class Dog extends Animal || Object.setPrototypeOf(Dog.prototype, Animal.prototype); || <u>extends</u> はプロトタイプチェーンを設定する。
|-
|-
| <u>super(name)</u> || <u>Animal.call(this, name);</u> || super()は親コンストラクタをthisに対して呼び出す
| super(name) || Animal.call(this, name); || <u>super()</u> は親コンストラクタを <u>this</u> に対して呼び出す。
|-
|-
| <u>super.speak()</u> || <u>Animal.prototype.speak.call(this);</u> || super.method()は親のprototypeのメソッドを呼び出す
| super.speak() || Animal.prototype.speak.call(this); || <u>super.method()</u> は親の <u>prototype</u> のメソッドを呼び出す。
|}
|}
</center>
</center>