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

推薦する

XHTML 入門チュートリアル: XHTML とは何ですか?

HTMLとは何ですか?簡単に言えば、HTML は Web ページを作成するために使用されます。とて...

読み取り専用と無効の違い

要約すると: Readonly は入力 (テキスト/パスワード) とテキスト領域に対してのみ有効です...

ティックアニメーション効果を作成するための svg+css または js

以前、上司からログイン後にチェックマークを表示できるプログラムを作るように言われたのですが、Baid...

mysqlは複数の主キーを設定する操作を実装します

ユーザーテーブル、ID番号は一意である必要があります、携帯電話番号、電子メールアドレスは一意である必...

MySQL の中国語文字化け問題の解決方法

1. LinuxのMySQLで中国語の文字化けが発生する。以下の操作を実行する。 vi /etc/m...

Linux bzip2 コマンドの使用

1. コマンドの紹介bzip2 は、ファイルの圧縮と解凍に使用されます。これは、Linux システム...

セマンティックウェブページ XHTML セマンティックマークアップ

構造とプレゼンテーションを分離するもう 1 つの重要な側面は、セマンティック マークアップを使用して...

Better-scrollはメニューとコンテンツをリンクする効果を実現します

1. 基本的な使い方 <!DOCTYPE html> <html lang=&qu...

Windows 10 に TomCat をインストールするチュートリアル図

WindowsにTomCatをインストールするこの記事では、WindowsプラットフォームにTomC...

MySQL PXC は IST 送信のみで新しいノードを構築します (推奨)

需要シナリオ: 既存の PXC 環境には大量のデータがあります。新しく購入したサーバーをこのクラスタ...

HTML テーブル タグ チュートリアル (31): セルの幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、セルの幅と高さはコンテンツに応じて自動的に調整されますが、セルの幅と高さを手動で設定...

Nginx ドメイン転送の使用シナリオ コード例

シナリオ 1: サーバーの制限により、外部に開かれているポートは 1 つだけですが、別の外部ネットワ...

Centos7でポートを開く方法

CentOS7 のデフォルトのファイアウォールは iptables ではなく、firewalle で...

nginx プロキシ サーバーで双方向証明書検証を構成する方法

証明書チェーンを生成するスクリプトを使用して、ルート証明書、中間証明書、および 3 つのクライアント...

Vue サーバーに js 構成ファイルをインポートする方法

目次背景成し遂げるvue-cli2.0での設定方法の補足要約する背景プロジェクトにはローカル構成ファ...