摘要:寫在前面在所有的前端面試中常常喜歡考面試者如何手寫一個(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
手動(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...
摘要:被調(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 第五版才被加入;它可能無法在所...
摘要:一功能需求使用掃碼槍掃描條碼,在一個(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...
摘要:一功能需求使用掃碼槍掃描條碼,在一個(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...
摘要:一功能需求使用掃碼槍掃描條碼,在一個(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...
閱讀 970·2022-06-21 15:13
閱讀 1855·2021-10-20 13:48
閱讀 1039·2021-09-22 15:47
閱讀 1373·2019-08-30 15:55
閱讀 3128·2019-08-30 15:53
閱讀 526·2019-08-29 12:33
閱讀 721·2019-08-28 18:15
閱讀 3467·2019-08-26 13:58