JavaScript の new 演算子の原理と例の詳細な説明

JavaScript の new 演算子の原理と例の詳細な説明

新しい用途

new の機能は、コンストラクターを通じてインスタンス オブジェクトを作成することです。インスタンス、プロトタイプ、コンストラクターの関係は次の図に示されています。

まずはまとめましょう

  1. 空のオブジェクトを作成する
  2. 空のオブジェクトの内部プロパティ __proto__ が、コンストラクター関数の prototype プロパティに割り当てられます。
  3. コンストラクタの this を空のオブジェクトを指すように設定します
  4. コンストラクタ内のコードを実行する
  5. 新しいオブジェクトを返す

詳細な説明

新しい操作を実行すると、次の手順が順番に実行されます。

1. 空のオブジェクトを作成する

  • 空のオブジェクトは Object のインスタンス、つまり {} です。
obj = {} とします

2. 空のオブジェクトの内部プロパティ__proto__がコンストラクタのプロトタイププロパティに割り当てられます。

  • この操作は、空のオブジェクトを正しいプロトタイプにリンクすることです。
関数Foo(num) {
  this.number = 数値
}

obj.__proto__ = Foo.prototype

3. コンストラクタのthisを空のオブジェクトにポイントする

  • つまり、コンストラクター内の this は空のオブジェクトに割り当てられ、後でコンストラクターが正しく実行されるようになります。
Foo.call(obj, 1)

4. コンストラクタ内のコードを実行する

  • つまり、空のオブジェクトにプロパティとメソッドを追加します。

5. 新しいオブジェクトを返す

  • コンストラクター内の return ステートメントを通じて参照型の値が返される場合、新しい操作は最終的にこの参照型の値を返します。それ以外の場合は、新しく作成されたオブジェクトを返します。
  • 参照型の値:​​ プリミティブ型の値 (数値、文字列、ブール値、null、未定義、シンボル値) を除くすべての値。

新しいオペレータのエミュレーション

次の myNew 関数は、new 演算子の動作をシミュレートします。

関数 myNew(func, ...args) {
  obj = {} とします
  obj.__proto__ = func.prototype
  res = func.apply(obj, args) とします。
  res インスタンスオブオブジェクトを返します? res : obj
}

関数Foo(num) {
  this.number = 数値
}

foo1 = myNew(Foo, 1) とします。
console.log(foo1 instanceof Foo) // true
console.log(foo1.number) // 1

foo2 = new Foo(2) とします。
console.log(foo2 instanceof Foo) // true
console.log(foo2.number) // 2

上記のinstanceof演算子は、コンストラクタの戻り値がObjectのインスタンスであるかどうか、つまり参照型の値であるかどうかを判断するために使用されます。これは、すべての参照型の値がObjectのインスタンスであり、Objectがすべての参照型値の基本型であるためです。

さて、JavaScript の new 演算子の原理に関するこの記事はこれで終わりです。JS の new 演算子の原理に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • JSにおけるnewの原理と実装について詳しく話しましょう
  • JS の new 関数の詳細な説明
  • JavaScript で new を実装する 2 つの方法の調査
  • JavaScript の new 演算子を自分で実装する方法
  • Js における new 演算子の役割の詳細な説明
  • c# Newtonsoft.Json の一般的なメソッドの概要
  • C# Newtonsoft.Json は、複数のネストされた JSON を解析してデシリアライズする例です。
  • c# Newtonsoft.Json パッケージ操作の追加
  • JavaScriptの新しいコマンド
  • JS での new の手書き実装

<<:  Ubuntuのpython3でvenvを使用して仮想環境を作成する

>>:  Windows10システムにスーパーセットをインストールする手順

推薦する

MySQL sql99構文の内部結合と非等価結合の詳細な説明

#事例: 従業員の給与水準を照会する 選択 給与、等級 から 従業員 参加する ジョブグレード g ...

CSS transform-originプロパティを理解する

序文最近、花火アニメーションを作成しました。花火が散るアニメーションです。アニメーションの実装中、花...

MySQL シリーズ: redo ログ、undo ログ、binlog の詳細な説明

取引の実施REDO ログはトランザクションの永続性を保証し、UNDO ログはトランザクションのロール...

Windows10 での MySQL msi インストール チュートリアル (画像とテキスト付き)

1. ダウンロード1. MySQL msi 公式 Web サイトから最新のダウンロードをクリックす...

<td></td> タグの境界線スタイルがブラウザに表示されない問題の解決方法

質問: 360ブラウザの互換モードなど、一部のブラウザでは、 <td style="...

Linux chkconfig コマンドの使用

1. コマンドの紹介chkconfig コマンドは、システム サービスの実行レベル情報を更新および照...

CSS Houdini でダイナミックな波効果を実現

CSS Houdini は、CSS 分野における最もエキサイティングなイノベーションとして知られてい...

MySQLのイベントスケジューラEVENTを理解する

MySQL のイベント スケジューラ EVENT は、Unix crontab や Windows ...

Ubuntu Server のターミナルのウェルカム メッセージで広告を無効にする方法

最新の Ubuntu Server バージョンを使用している場合、ようこそメッセージに、Ubuntu...

MySQL はカスタムシーケンスを使用して row_number 関数を実装します (詳細な手順)

いくつかの記事を読んだ後、ようやく MySQL で row_number() ソートを実装する方法が...

テーブル関連の配置とJavascript操作テーブル、tr、td

適切に機能するテーブル プロパティ設定:コードをコピーコードは次のとおりです。 <テーブル セ...

Vue-Jest自動テストの基本構成の詳しい説明

目次インストール構成よくある間違い事前テスト作業依存関係の扱いインスタンスとDOMを生成する要約する...

JavaScript で大きなファイルの並列ダウンロードを実装する方法

目次1. HTTP範囲リクエスト1.1 範囲構文2. 大きなファイルをダウンロードする方法2.1 補...

MySQLがフルテーブルスキャンを実行するいくつかの状況

目次ケース1:ケース2:ケース3:簡単にまとめると:過去 2 日間で、完全なテーブル スキャンを引き...

React Native JSIはRNとネイティブ通信のサンプルコードを実装します

目次JSIとはJSIの違いiOS で JSI を使用するiOS 設定RN側の構成jsはパラメータ付き...