原生JS實現NEW,帶參數

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

image.png

因此需要這個實例a.proto =構造函數.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)建。它是繼承構造函數的原型對象
第二步:
構造函數被執(zhí)行。執(zhí)行的時候,相應的傳參會被傳入,同時上下文會被指定為這個新的實例。
第三步:
如果這個構造函數返回了一個對象,那么這個對象就是實例的結果,也就是我們的a,如果沒有返回對象的,你們new處理的結果為步驟1創(chuàng)建的對象。

因此實現代碼:

function New(func) {
    // 創(chuàng)建一個空對象,繼承構造函數的原型對象
    var res = Object.create(func.prototype);
    // 執(zhí)行構造函數,傳遞上下文和參數
    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)
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容