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システムにスーパーセットをインストールする手順

推薦する

CentOS7 インストール Zabbix 4.0 チュートリアル (イラストとテキスト)

SeLinuxを無効にするsetenforce 0永久に閉店: vi /etc/selinux/c...

MySQL binlog の使用方法の詳細な説明

binlog は、MySQL のすべての DML 操作を記録するバイナリ ログ ファイルです。 bi...

CSSコンテンツ属性の具体的な使用法

コンテンツ属性は通常、::before および ::after 疑似要素で使用され、疑似要素のコンテ...

上部の固定ナビゲーションバーによって CSS アンカーの配置がブロックされる問題の解決方法

多くのウェブサイトでは、ユーザーが簡単に検索したり他のページに移動したりできるように、上部にナビゲー...

MySql 学習ノートにおけるトランザクション分離レベルの詳細な説明

背景トランザクションについて話すとき、誰もがそれに精通している必要があります。MySQL データベー...

docker compose を使用してハーバープライベートウェアハウスをインストールする詳細なチュートリアル

概要港とは何ですか?英語の単語の意味は「港」です。 Harborはコンテナ(貨物)を保管するために使...

js 学習ノート: class、super、extends キーワード

目次序文1. es6の前にオブジェクトを作成する2. es6 後のクラス宣言3. クラスの継承4. ...

Apache ポートに基づいて仮想ホストを作成する例

apache: ポートに基づいて仮想ホストを作成する仮想ホスト(a、b、c)の作成を例に挙げます1)...

jQueryのチェーンプログラミングスタイルの詳細な例

チェーンプログラミングの実装原理jQuery を使用すると、開発者は常にドット構文を使用して独自のメ...

HTML フォームタグチュートリアル (5): テキストフィールドタグ

<br />このタグは、さらにテキストを入力できる複数行のテキスト フィールドを作成する...

MySQLインデックスの基本構文

インデックスはソートされたデータ構造です。 where 条件での検索や order by 条件での並...

Linux ファイル管理コマンド例の分析 [表示、閲覧、統計など]

この記事では、Linux ファイル管理コマンドについて例を挙げて説明します。ご参考までに、詳細は以下...

Linux の traceroute コマンドの使用方法の詳細な説明

Traceroute を使用すると、情報がコンピュータからインターネットの反対側のホストまでたどるパ...

CSS3 の display:grid、グリッドレイアウトの紹介

1. グリッドレイアウト(グリッド): Web ページをグリッドに分割し、さまざまなグリッドを組み合...

Mysql 5.6.37 winx64 インストール デュアル バージョン mysql ノート

マシンに MySQL バージョン 5.0 がすでに存在する場合は、最新バージョンの MySQL のイ...