国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

手動(dòng)實(shí)現(xiàn)一個(gè)new操作

sevi_stuo / 3357人閱讀

摘要:寫在前面在所有的前端面試中常常喜歡考面試者如何手寫一個(gè)操作符,作為在準(zhǔn)備秋招的大三黨,我也要考慮這些。

寫在前面

在所有的前端面試中常常喜歡考面試者如何手寫一個(gè)new操作符,作為在準(zhǔn)備秋招的大三黨,我也要考慮這些。
那么我們先看看new操作符都干了什么事情,有哪些操作?通過下面的代碼來進(jìn)行思考:

// 新建一個(gè)類(構(gòu)造函數(shù))
function Otaku(name, age) {
    this.name = name;
    this.age = age;
    // 自身的屬性
    this.habit = "pk";
}
// 給類的原型上添加屬性和方法
Otaku.prototype.strength = 60;
Otaku.prototype.sayYourName = function () {
    console.log("I am " + this.name);
}
// 實(shí)例化一個(gè)person對(duì)象
const person = new Otaku("喬峰",5000);
person.sayYourName();
console.log(person);//打印出構(gòu)造出來的實(shí)例

解析

從控制臺(tái)打印出來的結(jié)果我們可以看出new操作符大概做了幾件事情:

返回(產(chǎn)生)了一個(gè)新的對(duì)象

訪問到了類Otaku構(gòu)造函數(shù)里的屬性

訪問到Otaku原型上的屬性和方法 并且設(shè)置了this的指向(指向新生成的實(shí)例對(duì)象)

通過上面的分析展示,可以知道new團(tuán)伙里面一定有Object的參與,不然對(duì)象的產(chǎn)生就有點(diǎn)說不清了。 先來邊寫寫:

// 需要返回一個(gè)對(duì)象 借助函數(shù)來實(shí)現(xiàn)new操作 
// 傳入需要的參數(shù): 類 + 屬性
const person = new Otaku("喬峰",5000);
const person1 = objectFactory(Otaku, "鳩摩智", 5000);

// 開始來實(shí)現(xiàn)objectFactory 方法 
function objectFactory(obj, name, age) {}
// 這種方法將自身寫死了 如此他只能構(gòu)造以obj為原型,并且只有name 和 age 屬性的 obj
// 在js中 函數(shù)因?yàn)閍rguments 使得函數(shù)參數(shù)的寫法異常靈活,在函數(shù)內(nèi)部可以通過arguments來獲得函數(shù)的參數(shù)
function objectFactory() {
    console.log(arguements); //{ "0": [Function: Otaku], "1": "鳩摩智", "2": 5000 }
     // 通過arguments類數(shù)組打印出的結(jié)果,我們可以看到其中包含了構(gòu)造函數(shù)以及我們調(diào)用objectfactory時(shí)傳入的其他參數(shù)
    // 接下來就是要想如何得到其中這個(gè)構(gòu)造函數(shù)和其他的參數(shù)
    // 由于arguments是類數(shù)組,沒有直接的方法可以供其使用,我們可以有以下兩種方法:
    // 1. Array.from(arguments).shift(); //轉(zhuǎn)換成數(shù)組 使用數(shù)組的方法shift將第一項(xiàng)彈出
    // 2.[].shift().call(arguments); // 通過call() 讓arguments能夠借用shift方法
    const Constructor = [].shift.call(arguments);
    const args = arguments;
    // 新建一個(gè)空對(duì)象 純潔無邪
    let obj = new Object();
    // 接下來的想法 給obj這個(gè)新生對(duì)象的原型指向它的構(gòu)造函數(shù)的原型  
    // 給構(gòu)造函數(shù)傳入屬性,注意:構(gòu)造函數(shù)的this屬性
    // 參數(shù)傳進(jìn)Constructor對(duì)obj的屬性賦值,this要指向obj對(duì)象
    // 在Coustructor內(nèi)部手動(dòng)指定函數(shù)執(zhí)行時(shí)的this 使用call、apply實(shí)現(xiàn)
    Constructor.call(obj,...args);
    return obj;
}

上面的代碼注釋太多,剔除注釋以后的代碼:

    function objectFactory() {
        let Constructor = [].shift.call(arguments);
        const obj = new Object();
        obj.__proto__ = Conctructor.prototype;
        Constructor.call(obj,...arguments);
        return obj;
    }

還有另外一種操作:

function myNew(Obj,...args){
  var obj = Object.create(Obj.prototype);//使用指定的原型對(duì)象及其屬性去創(chuàng)建一個(gè)新的對(duì)象
  Obj.apply(obj,args); // 綁定 this 到obj, 設(shè)置 obj 的屬性
  return obj; // 返回實(shí)例
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/95431.html

相關(guān)文章

  • 手動(dòng)實(shí)現(xiàn)一個(gè)new操作符理解

    手動(dòng)實(shí)現(xiàn)一個(gè)new操作符理解 網(wǎng)上看了一些手動(dòng)實(shí)現(xiàn)new操作符的方法和效果,現(xiàn)在來總結(jié)下 第一種方法 function new1(func) { var newObj = Object.create(func.prototype); // 創(chuàng)建一個(gè)繼承自func.prototype的新對(duì)象 var returnObj = func.apply(newO...

    lentoo 評(píng)論0 收藏0
  • 手動(dòng)實(shí)現(xiàn)bind函數(shù)(附MDN提供的Polyfill方案解析)

    摘要:被調(diào)用時(shí),等參數(shù)將置于實(shí)參之前傳遞給被綁定的方法。它返回由指定的值和初始化參數(shù)改造的原函數(shù)拷貝。一個(gè)綁定函數(shù)也能使用操作符創(chuàng)建對(duì)象這種行為就像把原函數(shù)當(dāng)成構(gòu)造器。其實(shí)這個(gè)思路也是庫如何實(shí)現(xiàn)繼承的方法。他的函數(shù)如下最后一步是將的指回。 update: 2018-06-08 原文鏈接 為什么要自己去實(shí)現(xiàn)一個(gè)bind函數(shù)? bind()函數(shù)在 ECMA-262 第五版才被加入;它可能無法在所...

    idisfkj 評(píng)論0 收藏0
  • 使用jQuery監(jiān)聽掃碼槍輸入并禁止手動(dòng)輸入的實(shí)現(xiàn)方法

    摘要:一功能需求使用掃碼槍掃描條碼,在一個(gè)頁面監(jiān)聽獲取掃碼槍的數(shù)據(jù),并禁止用戶進(jìn)行手動(dòng)的輸入操作。因?yàn)閽叽a槍的輸入速度非常的快,我測(cè)試的掃碼槍輸入的間隔大概在毫秒,然后手動(dòng)輸入的之間,除非刻意的想突破限制進(jìn)行快速的輸入。 基于jQuery的掃碼槍監(jiān)聽。如果只是想實(shí)現(xiàn)監(jiān)聽獲取條碼掃碼信息,可以直接拿來使用,如果有更多的條碼判斷處理邏輯需要自己擴(kuò)展。一、功能需求 使用掃碼槍掃描條碼,在一個(gè)web...

    plokmju88 評(píng)論0 收藏0
  • 使用jQuery監(jiān)聽掃碼槍輸入并禁止手動(dòng)輸入的實(shí)現(xiàn)方法

    摘要:一功能需求使用掃碼槍掃描條碼,在一個(gè)頁面監(jiān)聽獲取掃碼槍的數(shù)據(jù),并禁止用戶進(jìn)行手動(dòng)的輸入操作。因?yàn)閽叽a槍的輸入速度非常的快,我測(cè)試的掃碼槍輸入的間隔大概在毫秒,然后手動(dòng)輸入的之間,除非刻意的想突破限制進(jìn)行快速的輸入。 基于jQuery的掃碼槍監(jiān)聽。如果只是想實(shí)現(xiàn)監(jiān)聽獲取條碼掃碼信息,可以直接拿來使用,如果有更多的條碼判斷處理邏輯需要自己擴(kuò)展。一、功能需求 使用掃碼槍掃描條碼,在一個(gè)web...

    BlackHole1 評(píng)論0 收藏0
  • 使用jQuery監(jiān)聽掃碼槍輸入并禁止手動(dòng)輸入的實(shí)現(xiàn)方法

    摘要:一功能需求使用掃碼槍掃描條碼,在一個(gè)頁面監(jiān)聽獲取掃碼槍的數(shù)據(jù),并禁止用戶進(jìn)行手動(dòng)的輸入操作。因?yàn)閽叽a槍的輸入速度非常的快,我測(cè)試的掃碼槍輸入的間隔大概在毫秒,然后手動(dòng)輸入的之間,除非刻意的想突破限制進(jìn)行快速的輸入。 基于jQuery的掃碼槍監(jiān)聽。如果只是想實(shí)現(xiàn)監(jiān)聽獲取條碼掃碼信息,可以直接拿來使用,如果有更多的條碼判斷處理邏輯需要自己擴(kuò)展。一、功能需求 使用掃碼槍掃描條碼,在一個(gè)web...

    bingo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<