原生JS實現(xiàn)NEW,帶參數(shù)

new的使用方法是 var a = new 構(gòu)造函數(shù),a就是這個構(gòu)造函數(shù)的一個實例。
放上一張原型鏈的圖

image.png

因此需要這個實例a.proto =構(gòu)造函數(shù).prototype
而我們知道,a是一個對象,創(chuàng)建對象的幾種方法中,有一種是Object.create.

var o = Object.create(P)

等同于

o.__proto__ === P//true

因此如何創(chuàng)建a呢,就是

var o = Object.create(func.prototype);

new運算符的步驟
第一步:
一個新的對象被創(chuàng)建。它是繼承構(gòu)造函數(shù)的原型對象
第二步:
構(gòu)造函數(shù)被執(zhí)行。執(zhí)行的時候,相應(yīng)的傳參會被傳入,同時上下文會被指定為這個新的實例。
第三步:
如果這個構(gòu)造函數(shù)返回了一個對象,那么這個對象就是實例的結(jié)果,也就是我們的a,如果沒有返回對象的,你們new處理的結(jié)果為步驟1創(chuàng)建的對象。

因此實現(xiàn)代碼:

function New(func) {
    // 創(chuàng)建一個空對象,繼承構(gòu)造函數(shù)的原型對象
    var res = Object.create(func.prototype);
    // 執(zhí)行構(gòu)造函數(shù),傳遞上下文和參數(shù)
    var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));
    if (typeof ret === 'object' && ret !== null) {
        return ret
    } else {
        return res
    }
}
//測試代碼:
function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function () {
        alert(this.name);
    };
}
var p1 = New(Person, "Ysir", 24, "stu");
console.log(p1)
var a = New(Array)
console.log(a)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容