2017-02-11 8 views
0

私はJSのプロトタイプチェーンについて読んでいます。私はこの回路図をオンラインで見に来ました。FunctionとFunction.prototypeはどこにありますかプロトタイプチェーンのオブジェクトですか?

enter image description here

私の質問は:

関数AとBはタイプ機能のオブジェクトであるため、機能とFunction.prototypeオブジェクトがどこかに継承ツリーであってはなりませんか?

+0

これらの関数はオブジェクトを構築するために使用され、オブジェクト自体のプロトタイプチェーンにはありません。関数は代わりに 'prototype'プロパティを持ちます。これは、それらが構築するオブジェクトのチェーンに追加されます。 – Touffy

+0

@Touffy Functionとそのプロトタイプがプロトタイプチェーンに参加していないと言及しているソースを挙げることはできますか?それが本当なら、どうすればそのプロパティを使うことができますか? – SKG

+0

'function B'は' function A'から継承しません。 'function B'は' B'のプロトタイプを持つObjectのコンストラクタです。 – metame

答えて

2

コンストラクタ関数はプロトタイプチェーンで階層的に図化されていません。構築されるオブジェクトは、図の焦点です。

あり(obj任意Objectあるobj.__proto__を介してアクセス可能)[[proto]]差に重要な違い(と混同)があり、オブジェクトのPrototype性質、すなわち。 obj.prototype

このスニペットは説明できる:

function A(name){ 
 
    this.name = name 
 
    this.getName = function(){ return name } 
 
} 
 

 
function B(name){ 
 
    A.call(this, name) 
 
} 
 

 
var b = new B('yep') 
 
var anotherB = new B('me too') 
 

 
console.log(b.getName()) // yep 
 

 
/* both B & A constructors inherit from Function but B doesn't inherit from A */ 
 
console.log(B instanceof Function && A instanceof Function) //true 
 
console.log(B.prototype === A.prototype) //false 
 
console.log(B.__proto__ === A.__proto__) //true 
 
console.log(B instanceof A) //false 
 

 

 
/* an instance of B is not an instance of A */ 
 
console.log(b instanceof B) //true 
 
console.log(b instanceof A) //false 
 

 
/* an instance of B has the prototype of B but not the same [[proto]] as B */ 
 
console.log(B.prototype.isPrototypeOf(b)) //true 
 
console.log(b.__proto__ === B.__proto__) //false 
 

 
/* instances of B have the same [[proto]] but not the same [[proto]] as B */ 
 
console.log(b.__proto__ === anotherB.__proto__) //true

function Bfunction Aから継承されません。 function Afunction Bの両方がObjectから継承するFunctionを継承します。彼らはどちらも同じPrototypeチェーン(略称)を持っています。

function Afunction A - >Function - >Object

function Bfunction B - >Function - >彼らは構築オブジェクトと異なるObject

function Bから返されたObjectの場合、プロトタイプチェーンはB - >A - >Objectです。

+0

私は使用したいものに焦点を当てて画像を編集しました。いずれかの方法。あなたの答えにいくつか問題があります。 1.関数A - >関数 - >オブジェクト。 機能AまたはBには独自のプロトタイプがあります。空のオブジェクトです。彼らはどのようにFunctionから継承できますか?たぶん私はあなたの答えから何かを逃しています。少し詳しく教えていただけますか? 2.重要なことは、何らかの情報源を挙げてください。ありがとう。 – SKG

+0

新しいオブジェクトがコンストラクタ関数を使用してインスタンス化されると、JSエンジンはコンストラクタ関数の 'prototype'プロパティを調べ、それを使って新しいオブジェクトのプロトタイプを設定します。 'new a()'を 'var aInstance = Object.create(A.prototype)'と書くことでこれをシミュレートすることができます。コンストラクタ関数自身のプロトタイプは 'Function 'であることに注意してください。prototype' - 他のすべての関数と同じです。 –

+0

@MattBrowneあなたはFunction.prototype === B.prototype;を意味しますか? falseを返します。 – SKG