2017-06-22 6 views
0

Object.getPrototypeOf()関数を使用する場合、インスタンスのプロトタイプがそのコンストラクタのプロトタイプと同じではないのはなぜですか?`Object.getPrototypeOf()`関数を使用する場合、インスタンスのプロトタイプがそのコンストラクタのプロトタイプと同じでないのはなぜですか?

function A(n){this.n=n;}; 
 

 
let a = new A(1); 
 

 
console.log('Object.getPrototypeOf(a) == Object.getPrototypeOf(A); // ', 
 
\t Object.getPrototypeOf(a) == Object.getPrototypeOf(A)); 
 

 
console.log('Object.getPrototypeOf(a) == A.prototype; // ', 
 
\t Object.getPrototypeOf(a) == A.prototype);

+0

Object.getPrototypeOf(a)=== A.prototype –

答えて

2

Object.getPrototypeOf()prototype性と同じではない内部[[Prototype]]プロパティの値を返します。ファンクション(またはクラス)を作成すると、prototypeプロパティが取得され、そのインスタンスを作成すると、作成されたオブジェクトの内部の[[Prototype]]プロパティがクラスのprototypeプロパティに設定されます。 a[[Prototype]]A.prototypeあるので

あなたの最初の例では、falseに評価されますが、すべての機能がFunctionクラスのインスタンスであるため、A[[Prototype]]は、Function.prototypeです。

1

Aのプロトタイプ(Aが誘導されるプロトタイプオブジェクトは)Function.prototype、ないA.prototypeあるので、あなたはこれを見ている:

function A(n){this.n=n;}; 
 

 
console.log('Object.getPrototypeOf(A) === Function.prototype'); 
 
console.log(Object.getPrototypeOf(A) === Function.prototype); 
 

 
let a = new A(1); 
 

 
console.log('Object.getPrototypeOf(a) === A.prototype'); 
 
console.log(Object.getPrototypeOf(a) === A.prototype);

Object.getPrototypeOf(x)はちょうど複雑な方法ではありませんx.prototypeと書いてください。

Object.getPrototypeOf(x)は、xが由来するプロトタイプを返します。
x.prototypeは、xをコンストラクタとして使用して作成されたオブジェクトのプロトタイプです。

0

JSでプロトタイプの継承がどのように機能しているかを知っていれば、一見簡単ですが、答えはより明確になります。

まだ、プロトタイプの仕組みを簡単に説明しようとします。

JSでは、すべてがオブジェクトです。数値、文字列、ブール値などのプリミティブな値はオブジェクトのようには見えませんが、内部的にオブジェクトのように扱われます。

クイックリファレンスは以下を参照してください。すべてがオブジェクトです。 enter image description here

ここで問題のケースに来ることができます。 JSで何かを作成するたびに、既存のプロトタイプを使用します。これは、作成しているアイテムの種類によって異なります。

以下の行は基本的にバックグラウンドで多くのことをしています。これは、名前が 'A'の関数を作成しています。その間、JSエンジンはFunction.prototypeと呼ばれる既存の特殊オブジェクトをブラウザで使用します。これには、作成している関数の基本的な特性が含まれています。次に、コンストラクタとデフォルトのオブジェクトプロトタイプへのリンク(protoで参照される)の2つのプロパティのみを持つ新しいオブジェクトを作成します。そして、この新しく作成した関数に書き込んだ新しい関数定義を割り当てます。

function A(n){this.n=n;}; 

そこで私たちはここに理解するには、2つのプロトタイプいる:Function.prototypeは、我々がどの上述の既存のオブジェクトであることを

  • Function.prototype
  • A.prototype

を与えるだろう新しい機能を作り出すためにエンジンによって提供される。

A.prototypeは、Aが宣言されたときに作成される新しいオブジェクトです。新しい関数Aを使ってオブジェクトを作成していないことに注意してください。

JSエンジンは、A.prototypeからプロパティを継承する新しいオブジェクトを作成し、A(this.n = nなど..)に格納されている関数定義を実行し、新しく作成されたオブジェクトを返します。

  • A.prototype
  • から継承オブジェクト
  • A私はFunction.prototype
  • から

を継承機能(特殊目的)であるを要約する

let a = new A(1); 

以下のコードが何を意味するのかがはっきりしているはずです。

Object.getPrototypeOf(a) === A.prototype // true 
Object.getPrototypeOf(A) === Function.prototype //true 
関連する問題