プロトタイプチェーンを把握するには、最初にJavaScriptにクラスの概念がないため、機能的なプログラミング言語です。クラスには非常に重要な機能があります。つまり、コンストラクターに基づいたテンプレートとしてオブジェクトを作成できることです。 JavaScriptでは、関数には2つの関数があります
まず、一般的な関数呼び出しとして
第二に、そのプロトタイプオブジェクトのコンストラクターはnew()です
例を見てみましょう
コードコピーは次のとおりです。
関数a(){
this.name = 'a';
}
関数が作成されるとどうなりますか?
まず、関数オブジェクト、つまりそれ自体を作成します
第二に、それはプロトタイプオブジェクト@a( @で示される)を作成します
第三に、関数オブジェクトには対応するプロトタイプオブジェクトを指すプロトタイプポインターがあり、ここで@aを指します
第四に、@Aオブジェクトにコンストラクターポインターがあり、そのコンストラクターを指しています。
http://img.blog.csdn.net/201402222125611500?watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqvbgpsmtu3mdex/font/5a6l5l5l2t/fontsizedsize/400/fcmb/ 0/重力/南東
このプロトタイプ属性の使用は何ですか?
実際、プロトタイプ属性は、現在の関数が制御できる範囲を表します(または、ここでのコンストラクターは@Aプロトタイプオブジェクトのコンストラクターであるため、そのようなライティング方法があることがわかります。 。
コードコピーは次のとおりです。
関数a(){
this.name = 'a';
}
var a1 = new a();
これは、他の一般的な言語に似ています。
次に、オブジェクトを指すプロトタイプのプロパティを変更すると、テンプレートとして作成されたすべてのインスタンスに影響します
コードコピーは次のとおりです。
関数a(){
this.name = 'a';
}
var a1 = new a();
A.Prototype.age = 1;
アラート(a1.age);
結果:1
では、なぜA1オブジェクトはAGE属性に直接アクセスできるのでしょうか? A1オブジェクトの年齢属性を定義しません。
これは、すべてのインスタンス_proto_(Chrome、ChromeのFirfoxで直接アクセスできるが、IEはそれをサポートしていない)に参照があるためです。
コードコピーは次のとおりです。
関数a(){
this.name = 'a';
}
var a1 = new a();
アラート(A1._Proto_ == A.Prototype)
結果:true
属性にアクセスすると、最初に_proto_を指すオブジェクトを検索します。それを見つけてください、あなたは未定義に戻ります。
この時点で、プロトタイプチェーンの意味が出てきます。 Object.Prototypeはトップレベルのプロトタイプであるため、Object.Prototypeプロパティが変更された場合、すべてのオブジェクトに影響します。
コードを見ています
コードコピーは次のとおりです。
関数a(){
this.name = 'a';
}
関数b(){
this.age = 1;
}
b.prototype = new a();
アラート(new b()。名前);
BのプロトタイプをAのインスタンスにbを指すことを示し、BのインスタンスはAのプロパティにもアクセスできることを示します。これがJavaScriptの継承であるのに、なぜB.prototypeはA.プロトタイプを直接指すのではなく、Aのインスタンスを指すのですか?
コードコピーは次のとおりです。
b.prototype = new A.Prototype;
上記のP.Prototypeのプロパティを変更すると、Aのプロトタイプも変更されます。これは、親クラスの変更とサブクラスと親クラスのプロパティを組み合わせたサブクラスに相当します。不適切。言い換えれば、Bは@Aのコンストラクターにもなり、AとBは並行関係になります。
次に定義できます。
関数aは関数bを継承します。これは、関数aが関数bのプロトタイプのインスタンスになるようにするコンストラクターです。
コードコピーは次のとおりです。
var $ = jquery = function(selector、context){
//自分のコンストラクターで再び自分自身を構築することは不可能なので、別のコンストラクターインスタンスが返されました
新しいinit(セレクター、コンテキスト)を返します。
}
jquery.fn = jquery.prototype = {
サイズ:function(){
this.lengthを返します。
}
}
関数init(セレクター、コンテキスト){
}
init.prototype = jquery.fn ;;
}
これは、jQueryのソースコードです。
上記の知識を使用して、jQueryはjQueryプロトタイプの別のコンストラクターによって作成されたオブジェクト、つまり新しいinit()を返す一般的な関数への単なる呼び出しであると説明できます。