プロトタイプ・チェイニング
組織化されたプロトタイプ・チェーン
Functionオブジェクトとの関係
インスタンス間の関係
foo instanceof Foo // true
Foo instanceof Function // true
Function.prototype instanceof Object // true
// ObjectはObject
Object instanceof Object // true(Object.__proto__.__proto__ === Object.prototype)
// Objectは関数
Object instanceof Function // true(Object.__proto__ === Function.prototype)
// FunctionはObject
Function instanceof Object // true(Function.__proto__.__proto__ === Object.prototype)
// Functionは関数
Function instanceof Function // true(Function.__proto__ === Function.prototype)
鶏と卵、卵と鶏。
// Functionは関数
Function instanceof Function
Function.__proto__ === Function.prototype
ここでの議論は、FunctionオブジェクトがFunctionコンストラクタによって生成されたインスタンスかどうか?
説明2, NO: 関数は組み込みオブジェクトです。つまり、「関数コンストラクタによって生成された関数オブジェクト」というものは存在しません。実際、関数を直接書く場合、Functionコンストラクタを呼び出すことはありません。
スコープチェイニングとプロトタイプ継承のルックアップの違い
通常のオブジェクトのプロパティを調べて、それが現在のオブジェクトやそのプロトタイプに見つからない場合はundefinedを返しますが、探しているプロパティがスコープチェーンに存在しない場合はReferenceErrorを投げます。
その他
1. prototype は関数のプロパティですが、すべての関数のプロパティではありません。
a. コンストラクタとしての関数
b. 通常の関数としての関数
c.プロトタイプ関数
3.__proto__属性は、ウェブ・ブラウザとの互換性を確保するためにES6でのみ標準化されましたが、標準化以外のパフォーマンス上の理由から推奨されていません。より良いサポートのためには、Object.getPrototypeOf()を使用することをお勧めします。
オブジェクトの[[Prototype]]プロパティを変更してプロパティを継承することは、パフォーマンスに非常に深刻な影響を与える可能性があります。パフォーマンス消費に費やされる時間は、単にobj.__proto__ = ...ステートメントに費やされるだけではありません。 ステートメントに費やされるだけでなく、その[[プロトタイプ]]を継承するすべてのオブジェクトにも影響を与えるため、パフォーマンスを気にするのであれば、オブジェクトの[[プロトタイプ]]を変更すべきではありません。オブジェクトの[[Prototype]]プロパティを読み込んだり変更したりする場合は、以下のスキームが推奨されますが、オブジェクトの[[Prototype]]を設定するのはやはり遅い操作なので、パフォーマンスが問題になる場合は避けるべきです。
//
Object.getPrototypeOf()
Reflect.getPrototypeOf()
//
Object.setPrototypeOf()
Reflect.setPrototypeOf()
他のオブジェクトの[[Prototype]]も継承した新しいオブジェクトを作成したい場合は、Object.create()を使用することをお勧めします。
もちろん null や undefined にはコンストラクタのプロパティはありません。
これはFooのプロトタイプを実行するのではなく、関数Fooを指すからです。
4.プロトタイプ・チェインの構築はprototypeまたは__proto__に依存しますか?
proto__