一個(gè)例子 - 看懂JS中new關(guān)鍵字的實(shí)現(xiàn)原理

  1. 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;
}
  1. 測(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);
  1. 輸出結(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ù)。

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

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,295評(píng)論 0 17
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,619評(píng)論 1 32
  • 1. 如圖,我們有員工出生日期如左表,想要批量算出所有員工的年齡如右表。 2. 在表中黃色單元格內(nèi)輸入公式:=YE...
    lazyor閱讀 5,248評(píng)論 0 4
  • 看到了一半,這章的內(nèi)容有些顛覆我的認(rèn)知,想起兩年前做一個(gè)運(yùn)動(dòng)社交APP的公眾平臺(tái)搭建,為服務(wù)號(hào)還是訂閱號(hào)糾結(jié)了幾天...
    宋潔_8bc8閱讀 149評(píng)論 0 0
  • 不知不覺進(jìn)群成為正式會(huì)員已經(jīng)20天了,每天看到群里姐妹們滿滿正能量的分享和討論,自己工作忙,沒功夫插嘴,也很少發(fā)表...
    何和_3b9d閱讀 168評(píng)論 0 1

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