私はJSのプロトタイプチェーンについて読んでいます。私はこの回路図をオンラインで見に来ました。FunctionとFunction.prototypeはどこにありますかプロトタイプチェーンのオブジェクトですか?
私の質問は:
関数AとBはタイプ機能のオブジェクトであるため、機能とFunction.prototypeオブジェクトがどこかに継承ツリーであってはなりませんか?
私はJSのプロトタイプチェーンについて読んでいます。私はこの回路図をオンラインで見に来ました。FunctionとFunction.prototypeはどこにありますかプロトタイプチェーンのオブジェクトですか?
私の質問は:
関数AとBはタイプ機能のオブジェクトであるため、機能とFunction.prototypeオブジェクトがどこかに継承ツリーであってはなりませんか?
コンストラクタ関数はプロトタイプチェーンで階層的に図化されていません。構築されるオブジェクトは、図の焦点です。
あり(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 B
がfunction A
から継承されません。 function A
とfunction B
の両方がObject
から継承するFunction
を継承します。彼らはどちらも同じPrototypeチェーン(略称)を持っています。
function A
:function A
- >Function
- >Object
function B
:function B
- >Function
- >彼らは構築オブジェクトと異なるObject
。 function B
から返されたObjectの場合、プロトタイプチェーンはB
- >A
- >Object
です。
私は使用したいものに焦点を当てて画像を編集しました。いずれかの方法。あなたの答えにいくつか問題があります。 1.関数A - >関数 - >オブジェクト。 機能AまたはBには独自のプロトタイプがあります。空のオブジェクトです。彼らはどのようにFunctionから継承できますか?たぶん私はあなたの答えから何かを逃しています。少し詳しく教えていただけますか? 2.重要なことは、何らかの情報源を挙げてください。ありがとう。 – SKG
新しいオブジェクトがコンストラクタ関数を使用してインスタンス化されると、JSエンジンはコンストラクタ関数の 'prototype'プロパティを調べ、それを使って新しいオブジェクトのプロトタイプを設定します。 'new a()'を 'var aInstance = Object.create(A.prototype)'と書くことでこれをシミュレートすることができます。コンストラクタ関数自身のプロトタイプは 'Function 'であることに注意してください。prototype' - 他のすべての関数と同じです。 –
@MattBrowneあなたはFunction.prototype === B.prototype;を意味しますか? falseを返します。 – SKG
これらの関数はオブジェクトを構築するために使用され、オブジェクト自体のプロトタイプチェーンにはありません。関数は代わりに 'prototype'プロパティを持ちます。これは、それらが構築するオブジェクトのチェーンに追加されます。 – Touffy
@Touffy Functionとそのプロトタイプがプロトタイプチェーンに参加していないと言及しているソースを挙げることはできますか?それが本当なら、どうすればそのプロパティを使うことができますか? – SKG
'function B'は' function A'から継承しません。 'function B'は' B'のプロトタイプを持つObjectのコンストラクタです。 – metame