blog

問題15 プロトタイプ・チェイニング

この図は少し複雑なので、私自身のバージョンを描きましたが、実際には上の図よりも1、2、3、4行多くなっています。 説明1.YES:__proto__の「インスタンス」の定義によると、aはbのインスタン...

Oct 5, 2020 · 3 min. read
シェア

プロトタイプ・チェイニング

組織化されたプロトタイプ・チェーン

Functionオブジェクトとの関係

この図は少し複雑に見えますが、私自身のバージョンを描いてみました。実際には、上の図の関係よりも1行目、2行目、3行目、4行目が多くなっています。

インスタンス間の関係

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__

Read next

アプレット一般支払い

ステップ1アプレット側:openId,appIdを取得 ステップ2背景:統一注文 アプレット側:ポップアップチャージボックス ステップ3支払いコールバックツールクラスPayUti

Oct 5, 2020 · 10 min read