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

推薦する

VUE ユニアプリテンプレート構文についての簡単な説明

1.v-bind(略称:)コンポーネント プロパティのデータで定義されたデータ変数を使用するか、コン...

jsはカスタムドロップダウンボックスを実装します

この記事の例では、カスタムドロップダウンボックスを実装するためのjsの具体的なコードを参考までに共有...

Linux システムで HugePages をすばやく構成するための完全な手順

序文Linux システムの HugePages と Oracle データベースの最適化については、関...

CSSを使用してアダプティブスクエアを実装する方法の例

伝統的な方法は、正方形を固定形式で書くことです。長さ=幅を直接書き、次のように固定値を書きます。 。...

Pengyou.com モバイル クライアントのダウンロード ページのデザイン共有 (画像とテキスト)

まずは簡単なデータを見てみましょう。 Googleが発表したレポートによると、 ①中国の都市の97%...

ES6 における Object.assign() の使い方の詳細な説明

目次2. 目的2.1 オブジェクトにプロパティを追加する2.3 オブジェクトの複製2.4 複数のオブ...

MySQL でサーバーのインストールを開始できない場合の解決策について簡単に説明します。

コンピュータに初めて MySQL をインストールする場合、通常このエラー メッセージは表示されません...

HTML フォーム コントロールの無効な属性の読み取り専用と無効の概要

HTML でフォームの送信を無効にする方法は 2 つあります。 1. コントロールタグにreadon...

HTML要素にフォーカスを設定する方法

コードをコピーコードは次のとおりです。 <本文<フォームアクション="&quo...

dubbo での Zookeeper リクエストのタイムアウト問題: mysql8.0.15 に接続する mybatis+spring の構成

ここ2日間Javaを復習するつもりなので、練習にdubboを使ってショッピングモールプロジェクトを書...

MySQL クエリにおける LIMIT の大きなオフセットによって引き起こされるパフォーマンス低下の分析

序文MySQLクエリはselectコマンドを使用し、limitとoffsetパラメータを使用して、指...

Vue で 3D タグ クラウドを実装するための詳細なコード

プレビュー: コード:ページセクション: <テンプレート> <div class=...

Vue プロジェクトでよく使用されるツール機能の概要

目次序文1. カスタムフォーカスコマンド1. 方法1 2. 方法2 3. 方法3 2. 入力ボックス...

Bootstrap 3.0 学習ノート グリッドシステムの原則

前の 2 つの記事の簡単な紹介を通じて、Bootstrap についての基礎的な理解が得られました。 ...

JavaScript のシングルトン デザイン パターン

目次1. デザインパターンとは何ですか? 2. デザインパターンの5つの設計原則(SOLID) 3....