JS にこれがあるのはなぜですか?

JS にこれがあるのはなぜですか?

1. 需要

オブジェクトがあるとします

var 人 = {
    名前: 'フランク'、
    年齢: 18歳
    電話番号: '13812345678',
    こんにちは: 関数(){
      //補足予定},
    さようなら: 関数(){
      //補足予定}
}

このpersonオブジェクトには、 nameage属性、およびsayHiメソッドがあります。現在の要件は次のとおりです。

person.sayHi(...)を呼び出して、「こんにちは、私はFrank 、18 歳です。」と出力します。
person.sayBuy(...)を呼び出し、「さようなら、私の名前はFrankです。予約を取りたい場合は私に電話してください。私の電話番号は 13812345678 です」と出力します。
必要

要求はそれほど単純です。この要件を満たすことで、 thisの本質を理解することができます。

2. 解決策

var 人 = {
    ...
    sayHi: 関数(名前、年齢){
      console.log('こんにちは、私の名前は${name}です。私は${age}歳です')
    },
    さようなら: 関数(名前, 電話番号){
      console.log('さようなら、私の名前は ${name} です。私とアポイントメントを取りたい場合は、私に電話してください。私の電話番号は ${phone} です')
    }
}

呼び出し方法は

person.sayHi(人の名前、人の年齢)
person.sayBye(人名、人電話番号)

心配しないでください。このコードは愚かだとわかっています。次に改善します。

3. 最初の改善

上記の方法では、呼び出すたびにperson.nameパラメータとして選択する必要がありますが、これは非常に愚かなことです。 personを直接渡す方が適切です。コードは次のとおりです。

var 人 = {
    ...
    こんにちは: 関数(self){
      console.log('こんにちは、私は${self.name}、${self.age}歳です')
    },
    さようなら: 関数(self){
      console.log('さようなら、私の名前は ${self.name} です。私とアポイントメントを取りたい場合は、私に電話してください。私の電話番号は ${self.phone} です')
    }
}

呼び出し方法は

person.sayHi(人)
person.sayBye(人)

少しは良くなりましたが、コードはまだおかしなままです。
パラメータ内のpersonを省略してperson.sayHi()に変更できないのはなぜですか?

4.砂糖を加える

開発者が最も望んでいる呼び出し方法はperson.sayHi()ですそこで疑問になるのは、 person.sayHi()実際のパラメータがない場合、 person.sayHi関数はどのようにしてpersonを受け取るのかということです。

  • 方法1:最初のパラメータself personとして扱い、仮パラメータには常に実パラメータより1つ多い self が含まれるようにします。
  • 方法 2: selfを非表示にし、キーワードthisを使用してselfにアクセスします。

JS の父は方法 2 を選択し、 this使用してselfにアクセスしました。 Pythonの作成者は、self を最初のパラメータとして残す方法 1 を選択しました。

プロセスは次のとおりです。

// これを使用する前に:
こんにちは: 関数(self){
    console.log('こんにちは、私は${self.name}、${self.age}歳です')
}
// これを使用した後:
こんにちは: 関数(){
    // これは自分自身です
    console.log('こんにちは、私は${this.name}、${this.age}歳です')
}

5. 理解不能

これを使用した後の完全なコードは次のようになります。

var 人 = {
    名前: 'フランク'、
    年齢: 18歳
    電話番号: '13812345678',
    こんにちは: 関数(){
      console.log('こんにちは、私は${this.name}、${this.age}歳です')
    },
    さようなら: 関数(){
      console.log('さようなら、私の名前は ${this.name} です。私とアポイントメントを取りたい場合は、私に電話してください。私の電話番号は ${this.phone} です')
    }
}

今度は初心者が混乱する番です。 thisはいったい何なのでしょうか?それはどこから来たのですか?

これは隠された最初のパラメータです。 person.sayHi()を呼び出すと、そのperson thisになります。

6. 問題点

多くの JS 専門家は、これは十分に単純ではないと考え、 this使用することを軽蔑しています。そこで、JS の父は専門家向けにcallを使わない .call メソッドを用意しました。

person.sayHi.call(person) person.sayHi()と同等です。

.call の最初の引数は、構文糖なしで明示的にpersonです。

したがって、専門家は通常、 obj.fn.call(null,1,2,3)を使用してthis手動で無効にします。

このように、 person.sayHi.callのパラメータは実際には任意のオブジェクトにすることができます。

つまり、 person.sayHipersonのメソッドですが、任意のオブジェクトで呼び出すことができます。

7. オブジェクトと関数

JSにはクラスやメソッドはなく、オブジェクトと関数だけがあります。

JS classキーワードを追加した後、偽のクラスがほとんど作成されませんでした。

thisオブジェクトと関数の間の橋渡しとなります。

JSと比較すると、 this キーワードを使用せず、 selfパラメータを使用するPythonの方法の方が理解しやすいと思います。

JS になぜこれが存在するのかという記事はこれで終わりです。JS になぜこれが存在するのかという詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JSの矢印関数におけるこのポイントの詳細な説明
  • JavaScriptの原理と方向性
  • このリファレンスとJavaScriptのカスタムプロパティの詳細な説明
  • JavaScript における this ポイントの問題の詳細な説明
  • 関数の分類の詳細な説明とJavascriptでのこのポイントの例
  • JavaScript関数におけるこのポイントの問題の詳細な説明
  • JavaScriptにおけるこのポインティング問題の詳細な説明
  • JavaScriptの詳細な分析と方向の変更方法

<<:  DockerコンテナのライフサイクルアーキテクチャとVMとの違いについて詳しく説明します。

>>:  MySQLで行を列に変換する方法

推薦する

Ubuntuにmysql5.7.10を手動でインストールする

このチュートリアルでは、UbuntuにMySQL 5.7.10を手動でインストールする手順を参考まで...

データベースを削除せずにMySQLのすべてのテーブルを素早く削除する方法

この記事では、例を使用して、データベースを削除せずに MySQL 内のすべてのテーブルをすばやく削除...

Axios はリクエストをキャンセルし、重複リクエストを回避します

目次起源現状リクエストをキャンセル cancelTokenリクエスト方法の変更重複したリクエストを避...

Vue3 での provide と injection の使用

1. provideとinjectの説明Provide と Inject により、ネストされたコンポ...

MySQLで偽または真を保存する方法

MySQL ブール値、偽または真を格納つまり、データベースに保存されるブール値は 0 と 1 であり...

SWFObjectを使用すると、HTMLにFlashを挿入する際のブラウザ互換性の問題を完全に解決できます。

一緒に学びましょう1. 伝統的な方法コードをコピーコードは次のとおりです。 <object c...

ページにスクロールバーが表示されたときに、スクロールバーがページ幅に影響しないようにする方法

本体の幅をウィンドウの幅に設定します(次のスクリプトで制御されます) $("body&qu...

Vueで背景色と透明度を設定する方法

背景色と透明度の設定上記のように、最初の画像の場合は、灰色の背景と左上隅に白い「カバー」という文字を...

WeChat アプレットの日付と時刻のコンポーネント (年、月、日、時間、分)

この記事の例では、WeChatアプレットの日付と時刻コンポーネントの具体的なコードを参考までに共有し...

Vue マルチ選択リスト コンポーネントの詳細な説明

マルチ選択は、すべてのオプションを一覧表示し、ユーザーが Ctrl/Shift キーを使用して複数選...

ミニプログラムにより、製品属性の選択や仕様の選択が可能

この記事では、ミニプログラムで製品属性選択または仕様選択を実装するための具体的なコードを参考までに共...

MySQLオンラインデッドロック分析練習

序文MySQL を学習する際に、MySQL のロック メカニズムについて簡単に理解したことがあると思...

ドロップダウンメニューを実装するためのネイティブ js

ドロップダウン メニューも実生活では非常に一般的です。実装に使用される js コードは、タブ選択やア...

MySQLのROUND関数の丸め演算における落とし穴の分析

この記事では、MySQL の ROUND 関数を使用した丸め操作の落とし穴を例を使って説明します。ご...

リクエスト IP の最後のセグメントに基づいてトラフィックを分割するように Nginx を構成する方法

これは主に、場所パラメータのif判断の設定ジャンプです。迂回により、サーバーの負荷と圧力を軽減できま...