模擬new操作符

function imitateNew(func, ...args) {
    let obj = Object.create(func.prototype);

    let o = func.apply(obj, args); 
            
    return typeof o === 'object' ? o : obj;
}

let person = imitateNew(function(name, age) {
      this.name = name;
        this.age = age; 
}, 'Alima', 17)

// {name: "Alima", age: 17}

使用new操作符調(diào)用構(gòu)造函數(shù)經(jīng)歷的步驟

  1. 創(chuàng)建一個(gè)新對(duì)象,繼承構(gòu)造函數(shù)的原型對(duì)象
  2. 將構(gòu)造函數(shù)的作用域賦給新對(duì)象(this指向新對(duì)象)
  3. 執(zhí)行構(gòu)造函數(shù)中的代碼
  4. 返回新對(duì)象

返回的對(duì)象有三種情況

  1. 構(gòu)造函數(shù)沒有指定返回值,則返回構(gòu)造函數(shù)的實(shí)例化對(duì)象
  2. 構(gòu)造函數(shù)中返回值不是引用類型,則也返回構(gòu)造函數(shù)的實(shí)例化對(duì)象
  3. 構(gòu)造函數(shù)中返回值為引用類型,則返回該應(yīng)用類型

注:object.create()

let obj = Object.create(func.prototype) => 將obj的 [[Prototype]] 屬性指向func構(gòu)造函數(shù)的原型對(duì)象上

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 繼承 一、混入式繼承 二、原型繼承 利用原型中的成員可以被和其相關(guān)的對(duì)象共享這一特性,可以實(shí)現(xiàn)繼承,這種實(shí)現(xiàn)繼承的...
    magic_pill閱讀 1,080評(píng)論 0 3
  • 2017年2月4日,年初八,我在印象筆記記下第一篇晨間日記:“ 從頭開始,簡(jiǎn)單復(fù)制照做,和專業(yè)的人在一起,開啟我的...
    樂橙來了閱讀 373評(píng)論 2 0
  • I think my first school is good. Firstly, there is a larg...
    我要變更美閱讀 225評(píng)論 0 0