6

このドキュメントを読んだ後: http://es5.github.io/#x4.2.1

CF に関する 2 つのプロトタイプ参照と、次のステートメントに混乱しました。

CFp 内の CFP1 という名前のプロパティは、cf1、cf2、cf3、cf4、および cf5 によって共有されます (CF では共有されません)。

Javascript に関する文献の多くは、関数がファースト クラス オブジェクトであることを指摘しており、そのため、プロトタイプの継承を実現するためにオブジェクトのように暗黙的なプロトタイプ参照を設定できると期待しています (免責事項: 私は実際に何を知っているのかわかりません)。 d この継承を使用しますが、それが可能かどうかを確認するために思いつきました)。この暗黙のプロトタイプを関数に設定できますか、それとも常に Function.prototype を指しますか (それがデフォルトだと思います)。Function に明示的プロトタイプと暗黙的プロトタイプの両方があるのはなぜですか? また、Javascript の他の型には、明示的および暗黙的なプロトタイプ参照の両方がありますか、またはこの点で Function は一意ですか?

4

1 に答える 1

8

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

ここに画像の説明を入力

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]]objConstructorFunction.prototypevar obj = Object.create(someOtherObj)[[Prototype]]objsomeOtherObjObject.setPrototypeOf

この暗黙のプロトタイプを関数に設定できますか、それとも常に Function.prototype を指しますか (それがデフォルトだと思います)。

はい、__proto__またはを使用しObject.setPrototypeOfます。しかし、通常はそうすべきではありません。

Function に明示的プロトタイプと暗黙的プロトタイプの両方があるのはなぜですか? また、Javascript の他の型には、明示的および暗黙的なプロトタイプ参照の両方がありますか、またはこの点で Function は一意ですか?

Function(「Functionコンストラクター」) は単なる関数であり、他の関数と同様にprototypeプロパティがあります。それはオブジェクトでもあり、(ほとんど) 他のオブジェクトにはオブジェクトがあり[[Prototype]]ます。、、、などObject、他のタイプの標準コンストラクターもあります。それらはすべて関数であり、 aと a の両方があります。StringArrayBooleanNumberprototype[[Prototype]]

于 2013-08-24T00:15:26.383 に答える