和人交流時發(fā)現(xiàn)刃泌,現(xiàn)在面試可能會問到如何手寫一個new耙替,也就是如何自己手寫方法實現(xiàn)new()功能 俗扇,覺得自己從沒想過箕别,記錄一下。
首先 js是如何實現(xiàn)new的
function Person(name){? ??
this.name = name
}
Person.prototype.eat =function() {?
?? console.log("Eating")
}
var qd = new Person('qd')
console.log(qd)
qd.eat();
這就是js如何使用一個new的方法
手寫new如下:
function create() {?
?//1.獲取構(gòu)造函數(shù)啥酱,并刪除arguments中的第一項?
?var Con = [].shift.call(arguments);
?//2.創(chuàng)建一個空對象并連接到構(gòu)造函數(shù)的原型,使它能夠訪問原型中的屬性?
?var obj = Object.create(Con.prototype);?
// 3.使用apply改變構(gòu)造函數(shù)中this的指向?qū)崿F(xiàn)繼承微酬,使obj能夠訪問到構(gòu)造函數(shù)中的屬性?
?var ret = Con.apply(obj,arguments);?
?4.優(yōu)先返回構(gòu)造函數(shù)返回的對象
return ret instanceof Object ? ret : obj;
}
function Person (name) {?
?this.name = name
}
Person.prototype.eat =function() {
?console.log("Eating")
}
//調(diào)用
var qdleader = create(Person,'qdleader');
console.log(qdleader);?
qdleader.eat()?
當(dāng)然? create也可以這樣寫
function create() {?
?// 創(chuàng)建一個空的對象
let obj = {}
?// 獲得構(gòu)造函數(shù)?
?// 因為 arguments 類數(shù)組颗管,所以我們可以用數(shù)組的shift來實現(xiàn) arguments 的 ‘push’ 和 ‘pop’?
?// 將 arguments 進數(shù)組,并將第一個元素移除并賦值給?
Con (Constructor).letCon = [].shift.call(arguments)?
?// 鏈接到原型?
?obj.__proto__ = Con.prototype?
?// 綁定this帽馋,并執(zhí)行構(gòu)造函數(shù)比吭,就相當(dāng)于 obj .constructor(arguments)
let result = Con.apply(obj, arguments)?
?// 確保 new 出來的是個對象
return typeof result ==='object'? result : obj
}
當(dāng)然現(xiàn)實開發(fā)咱們直接使用new就好衩藤,這都是面試官測試你的專業(yè)知識而已赏表,參考了網(wǎng)上的各種文章,不會百度的前端不是好的櫥子逢慌。