仕様の図と、何が起こっているかを再現しようとするその下のコードを検討してください。

function CF() {}; // the constructor
CF.P1 = 'foo'; // P1 is an own property of the constructor; P2 is the same
var CFp = { CRP1: 'bar' }; // for now, just an object, with a CRP1 property
CF.prototype = CFp // set CFp as the 'explicit prototype property' of CF;
// only constructors have such a property
var cf1 = new CF(); // an instance;
var cf2 = new CF(); // another instance; cf3..cf5 are constructed the same way
Object.getPrototypeOf(cf1); // CFp; this is the 'implicit prototype link' from cf1 to CFp;
// put another way, CFp became the [[Prototype]] of cf1
あなたは次の文に混乱したと言いました: CFp の CFP1 という名前のプロパティは、cf1、cf2、cf3、cf4、および cf5 によって共有されます (しかし、CF によっては共有されません)。このことを考慮:
cf1.CRP1; // 'bar' - found on CFp through cf1
cf2.CRP1; // 'bar' - found on CFp through cf2
CF.CRP1; // undefined
CRP1
つまり、その文はfromの内容にアクセスできるがcf1..cf5
、コンストラクターからはアクセスできないことを意味しますCF
(関数/コンストラクターもオブジェクトであるため、プロパティを持つことができることを思い出してください)。そして、それはCFp
(の「所有者」CRP1
) が[[Prototype]]
ofではなく、CF
単にプロパティが指す値だからCF.prototype
です。プロパティは関数オブジェクトにのみ存在し、関数の呼び出しによって作成されたインスタンスprototype
の を定義するためにのみ使用され、コンストラクターとして呼び出されます (のように)。と両方の事実[[Prototype]]
new CF()
[[Prototype]]
prototype
「プロトタイプ」として読むことは、大きな混乱の原因です。おそらく、あなたを混乱させているものの一部です。うまくいけば、混乱が少なくなりました。それを念頭に置いて、私はあなたの他の質問に簡単に答えようとします.
Javascript に関する文献の多くは、関数がファースト クラス オブジェクトであることを指摘しているため、プロトタイプの継承を実現するために、オブジェクトのように暗黙のプロトタイプ参照を設定できると期待しています [...]。
ES5では、非標準プロパティを除いて、既存のオブジェクトの暗黙的なプロトタイプ参照 (または) を直接設定する方法はありません。あなたができることは、与えられた で新しいオブジェクトを作成することです。の がである場合、またはのであるでそれを行うことができます。それを行うために導入された言語の新しいバージョンが導入されましたが、パフォーマンス上の理由からその使用はお勧めできません。[[Prototype]]
__proto__
[[Prototype]]
var obj = new ConstructorFunction()
[[Prototype]]
obj
ConstructorFunction.prototype
var obj = Object.create(someOtherObj)
[[Prototype]]
obj
someOtherObj
Object.setPrototypeOf
この暗黙のプロトタイプを関数に設定できますか、それとも常に Function.prototype を指しますか (それがデフォルトだと思います)。
はい、__proto__
またはを使用しObject.setPrototypeOf
ます。しかし、通常はそうすべきではありません。
Function に明示的プロトタイプと暗黙的プロトタイプの両方があるのはなぜですか? また、Javascript の他の型には、明示的および暗黙的なプロトタイプ参照の両方がありますか、またはこの点で Function は一意ですか?
Function
(「Function
コンストラクター」) は単なる関数であり、他の関数と同様にprototype
プロパティがあります。それはオブジェクトでもあり、(ほとんど) 他のオブジェクトにはオブジェクトがあり[[Prototype]]
ます。、、、などObject
、他のタイプの標準コンストラクターもあります。それらはすべて関数であり、 aと a の両方があります。String
Array
Boolean
Number
prototype
[[Prototype]]