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)