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

推薦する

Linux で Xfce デスクトップ環境を使用すべき 8 つの理由

いくつかの理由(好奇心も含む)から、数週間前に Linux デスクトップとして Xfce を使い始め...

MySQLのロック機構の詳細な説明

序文データの一貫性と整合性を確保するために、あらゆるデータベースにはロック メカニズムが備わっていま...

Vue CLI のモードと環境変数の詳細な説明

序文実際のプロジェクトの開発では、通常、プロジェクト開発フェーズ、テストフェーズ、最終オンラインフェ...

MySQLインデックスの作成について知っておくべきこと

目次序文: 1. インデックスメソッドを作成する2. インデックスを作成するために必要な権限序文: ...

Linux を使用して時間指定ファイルが占有するディスク容量を計算する方法

スケジュールされたタスク エディターを開きます。Cent は、デフォルトで vim を使用して直接開...

JavaScript を使用してカルーセル効果を実装する

この記事では、カルーセルマップの特殊効果を実現するためのJavaScriptの具体的なコードを参考ま...

Vueはページに透かし効果を追加する機能を実装します

最近、あるプロジェクトに取り組んでいたとき、ページに透かし効果を追加するように依頼されました。さっそ...

jsはシンプルなカウントダウンを実装します

この記事の例では、参考までに簡単なカウントダウンを実装するためのjsの具体的なコードを共有しています...

Vue+ElementUI Treeの使い方

Vue+ElementUI Treeの使い方は参考までに。具体的な内容は以下のとおりです。 フロント...

MySQL の一般的なツール例の概要 (推奨)

序文この記事では主にMySQLでよく使われるツールに関する関連コンテンツを紹介し、皆さんの参考と学習...

LinuxでIPを表示する方法の例

ネットワークの問題のトラブルシューティング、新しい接続のセットアップ、ファイアウォールの構成を行うと...

JS におけるメモリと変数の保存についての詳細な説明

目次序文JSマジックナンバー数値の保存バイナリ変換方法なぜ 0.1 + 0.2 !== 0.3 なの...

Vueのデータ応答性原則の詳細な説明

この記事は主に、Vue のレスポンシブ ソース コードを理解していない、または触れたことがない人向け...

MySQL Binlog ログ処理ツールの比較分析

目次運河マクスウェルデータバスAlibaba Cloud のデータ転送サービス (DTS)運河ポジシ...