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で行を列に変換する方法

推薦する

スーパーバイザーを使用して nginx + tomcat コンテナを管理する例

必要: docker を使用して nginx + tomcat デュアル プロセスを起動します。実際...

VUE+SpringBootはページング機能を実装します

この記事では主に、Vue + SpringBoot でページ分割されたリストデータを実装する方法を紹...

ElementUIはドロップダウンオプションと複数選択ボックスのサンプルコードを実装します

目次ドロップダウン複数選択ボックスアップグレード - すべてのオプションを追加改訂と改善を求める製品...

VSCode+CMake+Clang+GCC 環境構築チュートリアル (Win10 の場合)

大学院入試に備えて、C/C++ を使って基本的なデータ構造とアルゴリズムを実装する予定です。アルゴリ...

HTML テーブル データを Json 形式に変換するサンプル コード

<table>テーブルデータをJSON形式に変換するJavaScript関数は次のとおり...

MySQL で group by を使用すると常にエラー 1055 が発生します (推奨)

MySQL で group by を使用すると常にエラー 1055 が発生するため、原因を確認する...

Linuxのファイル操作の知識ポイントを詳しく解説

ファイル操作に関連するシステムコール作成するint creat(const char *ファイル名,...

Docker を使って LEMP 環境を素早く構築する方法の例

LEMP(Linux + Nginx + MySQL + PHP)は、基本的に今日のWeb開発者にと...

自動同期テーブル構造のMySql開発

開発の問題点開発プロセスでは、データベース フィールドが頻繁に変更されるため、RD 環境と QA 環...

Tomcat は、Springboot プロジェクトの WAR パッケージの起動時にエラーを報告します: 子の起動時にエラーが発生しました

今日、会社の Springboot プロジェクトは、テストのためにテスト サーバーにデプロイする準備...

レスポンシブフレームワークのテーブルヘッダーの自動改行問題に対する簡単な解決策

最近、Bootstrap を使って Web サイトを開発しています。表を処理していたところ、PC で...

Vueは画像のズームとドラッグをサポートするリッチテキストエディタを統合しています

必要:ビジネス要件によると、写真をアップロードできる必要があり、アップロードされた写真はモバイル端末...

Linux 上の MYSQL 5.7 でルート パスワードを取得する際の問題 (テスト済み、利用可能)

目次1. --skip-grant-tables 経由で取得する1.1 my.conf を変更し、新...

Mysqlは日付範囲の抽出方法を指定します

データベースを操作する過程では、いくつかの指標を日付別にまとめたり、一定期間内の合計金額をカウントし...