摘要:如果綁定后的函數(shù)被了,那么此時(shí)指向就發(fā)生改變。構(gòu)造函數(shù)上的屬性和方法,每個(gè)實(shí)例上都有。接下來聲明一個(gè)函數(shù),在該中獲取了第二次傳的參數(shù),并且返回了的執(zhí)行。的又等于的實(shí)例。至此,就實(shí)現(xiàn)了自己的方法。
之前已經(jīng)實(shí)現(xiàn)過了call,apply和new。今天順便把bind也實(shí)現(xiàn)下。
首先:
bind方法返回的是一個(gè)綁定this后的函數(shù),并且該函數(shù)并沒有執(zhí)行,需要手動(dòng)去調(diào)用。(從這一點(diǎn)看bind函數(shù)就是一個(gè)高階函數(shù),而且和call,apply方法有區(qū)別)。
bind方法可以綁定this,傳遞參數(shù)。注意,這個(gè)參數(shù)可以分多次傳遞。
如果bind綁定后的函數(shù)被new了,那么此時(shí)this指向就發(fā)生改變。此時(shí)的this就是當(dāng)前函數(shù)的實(shí)例。
構(gòu)造函數(shù)上的屬性和方法,每個(gè)實(shí)例上都有。
ok,上代碼~
Function.prototype.mybind = function(context){ let that = this; let args1 = Array.prototype.slice.call(arguments,1); let bindFn = function(){ let args2 = Array.prototype.slice.call(arguments); return that.apply(this instanceof bindFn?this:context,args1.concat(args2)); } let Fn = function(){}; Fn.prototype = this.prototype; bindFn.prototype = new Fn(); return bindFn; }
首先 獲取到第一次傳遞的參數(shù)args1,此處要做截取處理,因?yàn)榈谝粋€(gè)參數(shù)是this。接下來聲明一個(gè)函數(shù)bindFn,在該bindFn中獲取了第二次傳的參數(shù)args2,并且返回了that的執(zhí)行。此處的that就是原函數(shù),執(zhí)行該原函數(shù)綁定原函數(shù)this的時(shí)候要注意判斷。如果this是構(gòu)造函數(shù)bindFn new出來的實(shí)例,那么此處的this一定是該實(shí)例本身。反之,則是bind方法傳遞的this(context)。最后再把兩次獲得的參數(shù)通過concat()連接起來傳遞進(jìn)去,這樣就實(shí)現(xiàn)了前3條。
最后一條:構(gòu)造函數(shù)上的屬性和方法,每個(gè)實(shí)例上都有。 此處通過一個(gè)中間函數(shù)Fn,來連接原型鏈。Fn的prototype等于this的prototype。Fn和this指向同一個(gè)原型對(duì)象。bindFn的prototype又等于Fn的實(shí)例。Fn的實(shí)例的__proto__又指向Fn的prototype。即bindFn的prototype指向和this的prototype一樣,指向同一個(gè)原型對(duì)象。至此,就實(shí)現(xiàn)了自己的bind方法。
代碼寫好了, 測試一下吧~
Function.prototype.mybind = function(context){ let that = this; let args1 = Array.prototype.slice.call(arguments,1); let bindFn = function(){ let args2 = Array.prototype.slice.call(arguments); return that.apply(this instanceof bindFn?this:context,args1.concat(args2)); } let Fn = function(){}; Fn.prototype = this.prototype; bindFn.prototype = new Fn(); return bindFn; } let obj = { name:"tiger" } function fn(name,age){ this.say = "汪汪~"; console.log(this); console.log(this.name+"養(yǎng)了一只"+name+","+age+"歲了 "); } /** 第一次傳參 */ let bindFn = fn.mybind(obj,"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109115.html
摘要:一是什么函數(shù)的內(nèi)部屬性,引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象。函數(shù)做為節(jié)點(diǎn)事件調(diào)用時(shí)指向節(jié)點(diǎn)本身做為構(gòu)造函數(shù)實(shí)力化方法時(shí)指向?qū)嵗龑?duì)象箭頭函數(shù)里的普通函數(shù),由于閉包函數(shù)是執(zhí)行的,所以指向箭頭函數(shù)的指向函數(shù)創(chuàng)建時(shí)的作用域。 一、this是什么? 函數(shù)的內(nèi)部屬性,this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象。也就是說函數(shù)的this會(huì)指向調(diào)用函數(shù)的執(zhí)行環(huán)境。 function a(){ retur...
摘要:第一種直接調(diào)用避免在不必要的情況下使用,是一個(gè)危險(xiǎn)的函數(shù),他執(zhí)行的代碼擁有著執(zhí)行者的權(quán)利。來自于此外,實(shí)現(xiàn)需要考慮實(shí)例化后對(duì)原型鏈的影響。函數(shù)柯里化的主要作用和特點(diǎn)就是參數(shù)復(fù)用提前返回和延遲執(zhí)行。手寫路徑導(dǎo)航 實(shí)現(xiàn)一個(gè)new操作符 實(shí)現(xiàn)一個(gè)JSON.stringify 實(shí)現(xiàn)一個(gè)JSON.parse 實(shí)現(xiàn)一個(gè)call或 apply 實(shí)現(xiàn)一個(gè)Function.bind 實(shí)現(xiàn)一個(gè)繼承 實(shí)現(xiàn)一個(gè)J...
JavaScript筆試部分 點(diǎn)擊關(guān)注本公眾號(hào)獲取文檔最新更新,并可以領(lǐng)取配套于本指南的 《前端面試手冊(cè)》 以及最標(biāo)準(zhǔn)的簡歷模板. 實(shí)現(xiàn)防抖函數(shù)(debounce) 防抖函數(shù)原理:在事件被觸發(fā)n秒后再執(zhí)行回調(diào),如果在這n秒內(nèi)又被觸發(fā),則重新計(jì)時(shí)。 那么與節(jié)流函數(shù)的區(qū)別直接看這個(gè)動(dòng)畫實(shí)現(xiàn)即可。 showImg(https://segmentfault.com/img/remote/146000002...
摘要:版本假設(shè)字符每個(gè)字符編碼小于等于為字符串長度。將數(shù)組的元素依次傳入一個(gè)函數(shù)中執(zhí)行,然后把它們的返回值組成一個(gè)新數(shù)組返回。復(fù)制代碼造輪子的同學(xué)注意數(shù)組的空元素不會(huì)再上述方法中遍歷出來。復(fù)制代碼方法,對(duì)數(shù)組進(jìn)行洗牌。 contains方法:判定一個(gè)字符串是否包含另一個(gè)字符串。常規(guī)思維,使用正則,但每次都要用new RegExp來構(gòu)造,太麻煩,性能太差。轉(zhuǎn)而使用原生字符串方法。如indexO...
摘要:我是前端我的全名是我是一個(gè)前端指向接收多個(gè)參數(shù),第一個(gè)是返回值返回值是一個(gè)函數(shù)上下文的,不會(huì)立即執(zhí)行??吕锘嚓P(guān)講解請(qǐng)移步簡版的實(shí)現(xiàn)就算完成了歡迎吐槽點(diǎn)贊 它們有什么不同?怎么用? call 接收多個(gè)參數(shù),第一個(gè)為函數(shù)上下文也就是this,后邊參數(shù)為函數(shù)本身的參數(shù)。 let obj = { name: 一個(gè) } ...
閱讀 3350·2021-11-18 10:02
閱讀 3506·2021-10-11 10:58
閱讀 3438·2021-09-24 09:47
閱讀 1204·2021-09-22 15:21
閱讀 4129·2021-09-10 11:10
閱讀 3316·2021-09-03 10:28
閱讀 1793·2019-08-30 15:45
閱讀 2191·2019-08-30 14:22