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