JavaScript の new 演算子を自分で実装する方法

JavaScript の new 演算子を自分で実装する方法

コンストラクタ

new を導入する前に、コンストラクターとは何かを知っておく必要があります。

コンストラクタと通常の関数の書き方には違いはありません。関数が new Fun() を通じて呼び出される場合、それはコンストラクタと呼ばれ、コンストラクタの最初の文字は通常大文字になります。

関数 User(名前) {
    this.name = 名前;
}

u = new User('leo'); とします。

ここで、User はコンストラクタです。もちろん、User() を直接呼び出すこともできますが、これではインスタンスは作成されません。非厳密モードでは、name 属性がウィンドウにハングします。

新しいオペレーター

では、インスタンスを作成するために new 演算子は具体的に何を行うのでしょうか?

new 演算子は、ユーザー定義のオブジェクト タイプのインスタンス、またはコンストラクターを持つ組み込みオブジェクトのインスタンスを作成します。新しいキーワードは次の操作を実行します。

1. 空の単純な JavaScript オブジェクト (つまり **{}**) を作成します。

2. オブジェクトを別のオブジェクトにリンクします(つまり、オブジェクトのコンストラクターを設定します)。

3. 手順 1 で新しく作成したオブジェクトを **this** のコンテキストとして使用します。

4. 関数がオブジェクトを返さない場合は、**this** を返します。

上記は新しいオペレータ - MDN から引用したものです

おそらく手順 2 と 4 がよく理解されていないと思うので、ここでもう一度要約します。

1. 空のオブジェクトを作成する u = {}

2. プロトタイプをバインド、u.__proto__ = User.prototype

3. User() 関数を呼び出し、空のオブジェクト u を this として渡します。つまり、User.call(u) です。

4. User() 関数が実行後にオブジェクト型を返す場合はこの変数を返し、そうでない場合はこれを返します。注: コンストラクタが基本型の値を返す場合は影響を受けず、これを返します。

自分で新しいものを実装する

new 演算子の原理を理解した上で、FakeNew 関数を自分で実装してみましょう。

関数FakeNew() {
    obj = {} とします。
  
    // 配列のような引数を配列に変換し、コンストラクターである最初のパラメーターをシフトアウトします。letconstructor = [].shift.apply(arguments);  

    // プロトタイプをバインドします obj.__proto__ =constructor.prototype;    
  
    // コンストラクターを呼び出して、obj を次のように渡します。let res = Constructor.apply(obj, arguments);    

    // 戻り値 return typeof res === 'object' ? res : obj;   
}

関数 User(名前) {
    this.name = 名前;
}

User.prototype.getName = 関数() {
    this.name を返します。
}

u = FakeNew(User, 'leo') とします。
コンソールにログ出力します。
コンソールにログ出力します。

対応するキーステップのコメントがコードに添付されているので、新しい操作を実装しました。今後新しいものを見ると、より明確な感覚が得られると思います。

以上がJavaScriptのnew演算子を自分で実装する方法の詳細です。JavaScriptのnew演算子の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

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

<<:  keepalived+nginx の高可用性を実装する方法の例

>>:  MySQL 5.7.21 のインストールとパスワード設定のチュートリアル

推薦する

LeetCode の SQL 実装 (196. 重複するメールボックスを削除する)

[LeetCode] 196.重複したメールを削除するSQL クエリを記述して、Person とい...

MySQLデータベースは何をするのか

MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース...

MySQLデータベースの数千万件のデータクエリとストレージの詳細な説明

目次百万レベルのデータ処理ソリューションデータストレージ構造設計クエリステートメントの最適化1000...

MYSQL開発パフォーマンス調査:バッチデータ挿入の最適化方法

1. どのような問題に直面しましたか?標準 SQL では、通常、次の SQL 挿入ステートメントを記...

CSS3 FlexBox の伸縮自在なレイアウトを 10 分で理解する

基本的な紹介特徴Flexbox は、よりシンプルで効率的なレイアウト方法を提供する CSS 表示タイ...

初心者のためのMySQL外部キーの設定方法

目次外部キーの役割mysql 外部キー設定方法要約する外部キーの役割データの一貫性、整合性を維持し、...

PIP で docker-compose をインストールする際のタイムアウト問題の解決方法

1: インストールコマンドpip install docker-compose例外情報socket....

HiveメタデータをMySQLに設定するプロセス全体

Hiveのインストールディレクトリで、confディレクトリに入り、hive-site.xmlファイル...

JavaScriptはイベントリスナーをイベント委任にバッチで追加します。詳細なプロセス

1. イベント委任とは何ですか?イベント委譲: イベントバブリングの特性を利用して、子要素に登録すべ...

MySQLサブクエリでorder byが効かない問題の解決方法

偶然にも、SQL ステートメントを異なる MySQL インスタンスで実行すると、異なる結果が生成され...

MySQL での正規表現の使用に関する詳細

目次1. はじめに2. 製品テーブルを準備する2.1 ステートメントの順序2.2 大文字と小文字の区...

マークアップ言語 - リスト

標準化されたデザインソリューション - マークアップ言語とスタイルマニュアルWeb 標準ソリューショ...

MySQL でデータベースを作成した後、ユーザー 'root'@'%' によるデータベース 'xxx' へのアクセスが拒否される問題を解決する

序文最近、仕事で問題が発生しました。データベースを作成した後、データベースに接続するときにエラーが発...

ChromeはCookieの変更を監視し、値を割り当てます

次のコードは、Chrome による Cookie の変更の監視を導入しています。コードは次のとおりで...

HTML pre タグ内の自動改行

このとき、overflow:auto;(コードがコンテナの境界を超えたときにスクロールボックスを表示...