JavaScriptのnewオペレータはどうやって自分で実現しますか?


前言new皆さんはきっとよく知らないと思います.独身で対象がない時はnew個です.便利です.実例を作る時、具体的にどのような操作をしましたか?今日は分析してみます.
構造関数newを紹介する前に、構造関数とは何かを知る必要があります.
コンストラクタと一般関数は書き方には何の違いもありません.一つの関数がnew Fun()を介して呼び出されると、コンストラクタと呼ばれ、コンストラクタの最初の文字は通常大文字です.
function User(name) {
    this.name = name;
}

let u = new User('leo');
ここで、Userは構造関数であり、直接User()を呼び出すこともできるが、このようにしては、作成例の役割を果たすことができず、非厳密なモードではname属性をwindowに掛けることができる.
new操作子
では、newオペレータは一体何をしましたか?例を作成できますか?new 演算子は、ユーザーが定義したオブジェクトの種類の例を作成します.または、構造関数を持つ内蔵オブジェクトの例を作成します.newキーワードは以下のように動作します.
  • は、空の単純なJavaScriptオブジェクト(**{}**)を作成する.
  • は、オブジェクト(すなわち、オブジェクトの構造関数を設定する)を別のオブジェクトにリンクする.
  • は、ステップ1で新たに作成されたオブジェクトを**this**のコンテキストとする.
  • は、関数がオブジェクトに戻っていない場合、**this**に戻る.
  • 以上の引用はnewオペレータ-MDNからである.
    第2、4歩はよく分からないかもしれませんが、ここで改めてこの4つのステップをまとめます.
  • は、空のオブジェクトu = {}
  • を作成する.
  • バインディングプロトタイプ、u.__proto__ = User.prototype
  • は、User()の関数を呼び出し、空のオブジェクトuthisとして着信した、すなわちUser.call(u)
  • である.
  • は、User()関数が自分returnobjectタイプを実行し終わったら、この変数を返します.そうでないとthisに戻ります.もし構造関数が基本タイプの値を返したら、影響はないですか?それともthis
  • に戻ります.
    自分でnewを実現します.newオペレータの原理を分かりました.次に私達自身でFakeNew関数を実現します.
    function FakeNew() {
        let obj = {};
      
        //      arguments     ,                shift   
        let Constructor = [].shift.apply(arguments);  
    
        //     
        obj.__proto__ = Constructor.prototype;    
      
        //       ,  obj    this   
        let res = Constructor.apply(obj, arguments);    
    
        //   
        return typeof res === 'object' ? res : obj;   
    }
    
    function User(name) {
        this.name = name;
    }
    
    User.prototype.getName = function() {
        return this.name;
    }
    
    let u = FakeNew(User, 'leo');
    console.log(u);
    console.log(u.getName());
    対応するキーステップの注釈はコードに添付されています.これでnewの操作が実現されました.皆さんが後でnewを見たら、納得できると思います.