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

推薦する

Dockerプライベートライブラリの実装

プライベート Docker レジストリのインストールとデプロイは、Docker テクノロジーを導入、...

LinuxベースのLVMシームレスディスク水平拡張の詳細な説明

環境名前財産CPU 5650 円メモリ4Gディスク20G+4TB この時点で、サーバーにはすでに次の...

JavaScript カラービューア

この記事では、カラービューアを実装するためのJavaScriptの具体的なコードを参考までに紹介しま...

MySQLクエリ文の実行プロセスを理解するための記事

序文要件を満たす特定のデータをデータベースから取得する必要があります。Select ABC FROM...

Ajax は CORS レスポンス ヘッダーを設定してクロスドメインの問題を解決し、クロスドメインのケース スタディを実現します。

1. クロスドメインを実現するためにCORSレスポンスヘッダーを設定するクロスオリジンリソース共有...

優れたユーザー エクスペリエンス デザイナーが行うべき 5 つのこと (画像とテキスト)

この記事は、@C7210 によって翻訳されたブログ「Usability Counts」からの翻訳です...

yumコマンドの使い方

1. yumの紹介Yum (フルネームは Yellow dogUpdater、Modified) は...

CSSマスクのフルスクリーン中央揃えを実装する方法

具体的なコードは次のとおりです。 <スタイル> #トーストローダーフルスクリーン{ 高さ...

MySQLパーティションテーブルは月別に分類されています

目次テーブルを作成するデータベース ファイルを表示します。入れるクエリ消去補足:Mysqlは月テーブ...

MySQL 8.0.13 のインストールと設定のグラフィックチュートリアル

Msyqlデータベースのインストール、参考までに具体的な内容は次のとおりです。 ①ブラウザでhttp...

Windows 10 での Hyperledger Fabric 1.4 環境構築プロセスの図

内容Hyperledger fabric1.4環境のWindows 10でのセットアップ前提条件Wi...

シンプルな商品スクリーニング機能を実現するjs

この記事の例では、商品スクリーニング機能を実装するためのjsの具体的なコードを参考までに共有していま...

JDBC 探索 SQLException 分析

1. SQLExceptionの概要JDBC を使用してデータ ソース (この記事のデータ ソースは...

MySQLクエリ速度が遅く、パフォーマンスが低下する原因と解決策

1. データベースクエリの速度に影響を与えるものは何ですか? 1.1 データベースクエリ速度に影響を...

ポートマッピング後に Docker コンテナが突然接続に失敗する問題のトラブルシューティング プロセス

1. 背景通常、外部サービスを提供する必要がある Docker コンテナの場合、起動時に -p コマ...