今日では、子供たちが質問を技術的なグループ:
Object.prototype.a = 関数(){ にconsole.log( 'A' ) } Function.prototype.b = 関数(){ にconsole.log( 'B' ) } 関数F(){} のvar F = 新しいF( ); FA(); FB(); FA(); FB();
心の中でI黙っユニバーサル式、出てきた何の答え:
A;
报错(FBが関数ではありません)。
A;
B;
トピックに噴火し、人々が疑問を持っていた、あなたはコンソールそれのノックアウトされています!
しかし、実際には、プロトタイプチェーンは、本当にとても簡単です。いくつかの単語の男は、言っ行い始めました!
まず、我々は簡単に行われてきたものを最終的にオブジェクト(新しい)をインスタンス化する説明しますか?
機能ベース(){ この II.A = 関数(){ にconsole.log( 'IベースAで午前' ) } } Base.prototype.b = 関数(){ にconsole.log(「Iプロトタイプベースでbは" ) } VAR OBJ = 新新ベース(); //は、実際には次のことをやっ // VAR OBJ = {}; // OBJ .__ proto__ = Base.prototype; // Base.call(OBJ); // 最初の行は、我々は、空のオブジェクトOBJ作成 // 我々がメンバオブジェクトプロトタイプ関数にこの空のオブジェクトポイントのメンバーを__proto__れ、二行目をベースオブジェクト // この第3行、我々はベースメンバ関数をOBJに割り当てられました
このコンソールは、それをテストするには:
さて、あなたは子どもたちが提起した問題を確認し、問題解決を開始することができます。
Object.prototype.a = 関数(){にconsole.log( 'A' )} Function.prototype.b = 関数(){にconsole.log( 'B' )} 関数F(){} のvar F = 新しいF( ); FA(); FB(); FA(); FB()。
我々は、Fのプロトタイプチェーンを開始しました:
F === .__ proto__ F.prototype; // プロトタイプは、オブジェクトの性質であるので、Objectから継承されますので、.__ proto__ ===のObject.prototype F.prototype プロト__.__ proto__ === .__ F のObject.prototype; // プレス一つは、のObject.prototype .__ proto_が直接nullに割り当てられたJSように、無限になること、のObject.prototype .__ proto__ =のObject.prototype来る F .__プロト__.__プロト__.__ proto__ === ヌルを。
私たちは、答えが出てきたように関係なく、プロトタイプチェーンfが何Function.prototype、FA()出力aは、FBが文句を言うことに気づきます。
私たちは、プロトタイプチェーンFを展開します。
=== .__ proto__ F Function.prototype; // プロトタイプオブジェクトの性質であるため、オブジェクトから継承されるので、.__ proto__ ===のObject.prototype Function.prototype F .__プロト__.__ proto__ === のObject.prototype; .__ proto__ F。 __.__ proto__ __proto === nullを。
OK、Function.prototypeのObject.prototypeチェーンはプロトタイプであり、出力は、答えが明らかにされ、(のFaをを有することになる)、FB()出力Bを出力します。
私は、以前のユニバーサル式を言及した大衆がメロンを食べる表し、式はこれですされていますか?もちろん、持って慎重に私に聞いてくださいません。
Object.b();; Function.a(); Function.b();だけで話は終わった、私はあなただけの条件Object.a()、バック問題の気まぐれに子供を尋ね出力?
子どもたちは答え:; B; B;
悪いが、彼は判決を受けていない(彼の1と4間違った実際には、その理由を教えてくれるのフォローアップ):
1. Object.a();直接プロトタイプ値。
2.オブジェクトがFunction.prototypeのインスタンスである、Bを継承することができます。
3.機能.__ proto__ === Function.prototype。
4. Function.b();直接プロトタイプ値。
???Object.prototypeが探して直接にObject.a第一歩?これはまた、我々はプロトタイプチェーンを把握大きな問題は、あまり話をしなかった可能性があり、オブジェクトのプロトタイプチェーンを広めてください。
// オブジェクトが関数であり、関数から継承 オブジェクト.__ proto__ === Function.prototype、 オブジェクト.__プロト__.__ proto__ === のObject.prototype、 オブジェクト.__プロト__.__プロト__.__ proto__ === ヌル。
そのため、慎重な友人が彼の間違いを発見した()のObject.prototype対応で見つけproto__とき、Object.aは、実際にオブジェクト.__プロト__.__へのアクセス権を持っています。
また、プロトタイプチェーン機能を立ち上げ、それらを繰り返すことはしません。
// 関数自体も関数であり、それゆえ彼の継承 機能.__ proto__ === Function.prototypeを、 機能.__プロト__.__ proto__ === のObject.prototype; 機能.__プロト__.__プロト__.__ proto__ === nullを。
ユニバーサル式を導くために、私は再び拷問魂を送りました。
// 在刚才的前提下 のvar C = 1 ; console.a(); // console.b(); // console.bは、関数ではありません )(CA; // CB(); // CBは関数ではありません )(console.log.a。// console.log.b(); // B
この時点で、学生はすでにプロトタイプチェーンを展開することを学ぶの答えを知って、私はちょうど私のユニバーサル式を教えてあげましょう:
JSでは、すべてのものは、対象となっている限りのObject.prototype法上の書き込みなど、すべてがアクセスすることができ、かつFunction.prototypeの関数法、のみアクセスするために()メソッドの呼び出しによって、
だから私はちょうどあなたが機能(の形で呼び出すことができます)このオブジェクトを参照する必要があり、彼はFunction.prototypeにアクセスできるかどうかを決定することができるようになります。トピックの人々の問題を再び想起し、学習されません突然のすべては、与えられたABの答えに来て、fは誤差の関数オブジェクトだけで、f()は報告されますされており、Fは()呼び出すことができます機能です付属バンバンダ~~~フィール
最終Cober教師や彼のキラーインタビューの質問、別の方法があるプロトタイプチェーンの後にインタビューを与えます:
= Object.prototype.aの関数(){ にconsole.log( 'iは物体Aで午前' ) } Object.prototype.b = 関数(){ にconsole.log( 'iは物体Bで午前' ) } 関数。 prototype.a = 関数(){ にconsole.log( '私は関数' ) } Function.prototype.b = 関数(){ にconsole.log( 'Iが関数Bで午前' ) } 関数F() { この II.A = 関数(){ にconsole.log( 'I Fです') } } F.prototype.a = 関数(){ にconsole.log( '我是F的プロトタイプ中の的とA' ) } のvar F = 新しいF()。 FA(); FB(); FA(); FB(); Object.a(); Object.b(); Function.a(); Function.b()。
(注意:呼び出しシーケンスは、プロトタイプチェーンのFAである - > F .__プロト__ - > F .__プロト__.__プロトは__、アクセスがnullになるまで...)