- new的實(shí)現(xiàn)代碼如下:
// new的實(shí)現(xiàn)
function NewFn(fn) {
// 判斷是否有原型對(duì)象,并當(dāng)作new的原型對(duì)象
let proto = Object(fn.prototype) === fn.prototype ? fn.prototype : Object.prototype;
// 利用原型創(chuàng)建new的對(duì)象
let obj = Object.create(proto);
// 把obj當(dāng)作fn的this調(diào)用, 并解析去除fn在arguments里面的位置,剩余的傳進(jìn)去
let res = fn.apply(obj, Array.prototype.slice.call(arguments, 1));
// 判斷返回的是否是對(duì)象
if (Object(res) === res) {
// 是對(duì)象則返回經(jīng)過fn處理過的res
return res;
}
// 不是對(duì)象返回obj
return obj;
}
- 測(cè)試用例如下
// 構(gòu)造函數(shù)
function Foo(name) {
this.name= name;
this.go = function() {
console.log(this.name + " go");
}
}
Foo.prototype.base = "mother";
// 測(cè)試用例
var foo = NewFn(Foo, "jason");
console.log(foo.name);
console.log(foo.base);
foo.go();
console.log(foo instanceof Foo);
- 輸出結(jié)果
jason
mother
jason go
true
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。