はじめに
これはさまざまなオブジェクト プログラミングで非常に重要な役割を果たし、主に呼び出し元のオブジェクトを指すために使用されます。ただし、JavaScript では、特に実行コンテキストが異なると、このパフォーマンスが大きく異なります。
前の記事から、これは実行コンテキストの属性でもあるため、実行コンテキストから切り離せない運命にあることがわかりました。
JavaScript では、this の値は呼び出しモードによって異なります。呼び出しモードには、メソッド呼び出しモード、関数呼び出しモード、コンストラクター呼び出しモード、適用呼び出しモードの 4 つがあります。
呼び出しパターン
メソッド呼び出しパターン
関数がオブジェクトのプロパティとして保存される場合、それをメソッドと呼びます。メソッドが呼び出されるとき、this はオブジェクトにバインドされます。つまり、メソッド呼び出しパターン内の this は呼び出し元のオブジェクトを指します。これは非常に理解しやすいです。あなたは私の方法であり、あなたは私のものであり、もちろんあなたのこれは私を指します。
これを通じて自分が属しているオブジェクトにアクセスできるため、これを通じてオブジェクト内のプロパティやメソッドを呼び出したり、変更したりできます。前の記事からわかるように、this は、実行コンテキストの属性のメンバーとして、コンテキストの作成時に作成する必要があります。このオブジェクトと this のバインドはすべて、呼び出し時に行われます。遅延バインディング」。遅延バインディングにより、これを高度に再利用できます。
上記の例の関数 showValue は遅延バインディングに属します。
関数呼び出しモード
オブジェクトのメソッドとして関数を呼び出さない場合、関数呼び出しとなります。関数呼び出しモードでは、これはグローバル オブジェクトにバインドされます。 (これは言語設計上のミスです)
通常の考え方によれば、4 行目の出力のように、これは関数が属するオブジェクトを指すはずですが、言語設計の問題により、これはグローバル オブジェクトを指します。これにより、これはさらに神秘的で予測不可能になります。しかし、開発者としては、この状況は絶対に見たくないものです。カードをプレイすることは常識ではありません。上の例では、これを解決するために使用されています。このようにヘルパーメソッド内で呼び出すとこのように使えるので簡単で便利です。関数呼び出しモードについては、なぜこのような動作になるのかについては、参照型を解析する際に詳しく説明します。
コンストラクター呼び出しモード
JavaScript はプロトタイプの継承に基づいているため、設計者は new を渡し、コンストラクターがオブジェクトを作成して、オブジェクト指向プログラミングを実現できるようにしたいと考えています。これは良いアイデアではないようですし、犬の代わりに虎を描くのは少し恥ずかしいです。 1つは、学ぶことは不可能だが、学ぶ必要はないということです。 JavaScript のプロトタイプ継承メカニズムはすでに非常に強力であり、オブジェクト指向に必要な継承ポリモーフィズムを満たすのに十分です。
早速、コンストラクターの呼び出しパターンについて説明しましょう。コンストラクターの呼び出しパターンは非常に単純で、関数をコンストラクターとして使用し、これを使用して公開するプロパティとメソッドを導入します。以下の通り
var p1 = new Person("jink", 24);
p1.say() //出力名:ジンク、年齢:24
var p2 = new Person("Zhang San", 33);
p2.say();//出力名: Zhang San、年齢: 33
上記の例から、これが new とコンストラクターを通じて作成されたオブジェクトを指していることが明確にわかります。なぜこのようなことが起こっているのでしょうか?これは、JavaScript で new を介してコンストラクターが呼び出される場合、new 演算子が "person" 関数の内部 [[Construct]] メソッドを呼び出し、オブジェクトの作成後に内部の [[Call]] メソッドが呼び出されるからです。と呼ばれた。 まったく同じ関数「person」は、新しく作成されたオブジェクトに this の値を設定します。
apply 呼び出しモード
JavaScript のすべての関数が作成されると、apply と call の 2 つのメソッドが存在します。これら 2 つの方法の具体的な使い方については、ここでは詳しく説明しません。知らない学生は、Baidu で検索することができます。 2 つの方法でこれを手動で設定できます。これを作成中に変更することはできませんが、作成前に手動で設定する場合は別の問題になります。この設定は驚くべきもので、車を海で航行させたり、アフリカ象をジャガーのようにスピードを上げたり、プログラマーをピアニストのように演奏させたりするのと同じように、オブジェクトに任意のメソッドを呼び出すことができます。はは、想像力は常に美しいですが、呼び出した後にその機能が実現できるかどうかは別の問題です。
var pianist = {
name : "ピアニスト",
hand : "柔軟な手",
play : function(){
console.log(this.name これを「使用」します。 hand "美しい音楽をかけてください。");
}
}
var player = {
name : "アスリート",
foot : "強い脚",
run : function(){
console.log(this.name これを「使用」します。足 "フィールドでレースします。");
}
}
//ルールに従います
programmer.programme() //プログラマーは柔軟な手でコードを書きます。
pianist.play(); //ピアニストは柔軟な手を使って美しい音楽を演奏します。
player.run(); //アスリートは強い脚でフィールドを走ります。
//気まぐれ
pianist.play.apply(programmer); //プログラマーは柔軟な手を使って美しい音楽を演奏します。
player.run.apply(programmer); //プログラマはフィールド上での実行に未定義を使用します。運動不足で脚力がありません
上記は興味深いようです。 apply の最初のパラメータは、実行メソッドの this ポインタです。このように、他の人のメソッドを借りて、プライベートかつ秘密裏に使用することができ、非常に便利です。このタイプの手法は、一部のフレームワークでよく使用されます。
まとめ
これを読んだ後、誰もがさまざまな状況でのこの判断をある程度理解できると思います。本来は次の章で参照オブジェクトについて説明する予定でしたが、メソッド呼び出しモードと関数呼び出しモードでこの値の原理を説明する予定でしたが、長くなりそうなので別章にすることにしました。参照オブジェクトの概念を分析します。