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

推薦する

Vue プロジェクトに Electron を追加するための詳細なコード

1. package.jsonに追加する "メイン": "electr...

Linux で独自の Nexus プライベート サーバーを構築する方法

この記事では、Linuxサーバー上でDockerを使用してNexusプライベートサーバーを構築する方...

CSS ハート型読み込みアニメーションのソースコードの実装

さっそく、コードをお見せしましょう。コードは非常にシンプルなので、勉強すれば理解できるようになります...

CentOS 6.6 ソースコードのコンパイルと MySQL 5.7.18 のインストールチュートリアルの詳細な説明

1. ユーザーとグループを追加する1. mysqlユーザーグループを追加する # グループ追加mys...

要素テーブルの行と列のドラッグを実装する例

要素 ui テーブルにはドラッグ アンド ドロップによる並べ替え機能が組み込まれておらず、サードパー...

非常に便利なオープンソース Docker ツール 5 つを強くお勧めします

導入Docker コミュニティは、さまざまなユースケースを処理するのに役立つ多くのオープンソース ツ...

ウェブページのアクセス速度に関する主な問題と解決策

<br />ウェブサイトのアクセス速度はウェブサイトのトラフィックに直接影響を及ぼし、ウ...

MySQL インフラストラクチャ チュートリアル: クエリ ステートメント実行プロセスの詳細な説明

序文私は以前から、SQL 文がどのように実行され、どのような順序で実行されるのかを知りたいと思ってい...

IE6のmin-widthとmin-heightと互換性を持たせる簡単な方法

ウェブサイトがワイドスクリーンの場合、ブラウザ ウィンドウを左右にドラッグすると、ウェブサイトの幅が...

Navicat Premium15 でクラウド サーバーに接続する際のデータベースの問題と落とし穴

クラウドサーバーを使用するとデータベースに接続できる場合もありますが、Navicat Premium...

JDBC を MySQL 5.7 に接続する方法

1. まずMySQLとEclipseの環境を準備します。環境がセットアップされたら、Eclipseの...

Linux でソースインストールされたパッケージを簡単に削除する方法

ステップ1: Stowをインストールするこの例では CentOS を使用しているため、拡張 EPEL...

CSS を使用して同じ親タグの左側と右側に 2 つのボタンを配置する方法

この記事では、主に同じ親タグの左側と右側にある 2 つのボタンの CSS レイアウト方法を紹介し、皆...

CentOS7 から CentOS8 にアップグレードする方法 (詳細な手順)

この記事では、具体的な例を使用して、CentOS 7 から CentOS 8 にアップグレードする方...

ウェブデザインにおけるテキスト入力ボックスのパラメータの説明

一般的なゲストブック、フォーラムなどでは、テキスト入力ボックスが使われています。これは HTML 言...