bind原始碼重寫

2021-09-26 22:40:33 字數 2277 閱讀 6603

前言

在了解怎麼實現bind之前我們先來了解一下bind的功能,正所謂知己知彼百戰不殆。

原生bind的功能

bind的功能主要用來強制繫結函式的this,然後返回乙個新的函式

function

show

(...args)

var obj =

var newshow0 = show.

bind()

var newshow1 = show.

bind

(obj)

var newshow2 = show.

bind

(obj,1,

2,3)

var newshow3 = show.

bind

(obj,1,

2,3)

var newshow4 = show.

bind

(obj,1,

2,3)

newshow1()

newshow1.isshow =

true

console.

log(newshow1.istrue, show.istrue)

newshow2()

newshow3(4

)new

newshow4()

newnewshow4(4

)

總結bind的功能

以上例子我們可以看出bind的功能主要有一下幾點:

1. 函式show呼叫bind方法,需要傳遞引數target, ...args

2. 呼叫bind方法後的函式返回乙個新的函式,向新的函式物件新增屬性不會修改原本函式。

3. 函式newshow在執行的時候,具體的功能還是用的show的功能,只不過showthis改為了target。如果不任何引數,那麼showthis指向window

4. 函式newshow在執行的時候可以傳遞引數,並且傳遞的引數會拼接到bind的時候傳遞的引數後面

5. 當以new的建構函式形式執行newshow時,showthis依舊是show而不是bind時傳入的obj

總結了bind的以上功能之後,我們可以依據功能書寫原始碼。

實現繫結this,傳遞引數後返回乙個新函式

function.prototype.

bind

=function

(target)

return f

}

根據以上**我們就完成了上述功能的1、3、4功能,還剩下兩個功能。

用聖杯模式實現新函式和老函式原型的解綁

function.prototype.

bind

=function

(target)

// 聖杯模式:通過new 建立的中間建構函式temp,實現f和temp的繼承

vartemp

=function()

; temp.prototype = self.prototype;

f.prototype =

newtemp()

return f

}

通過聖杯模式我們可以實現新函式和老函式的關係解綁,當我們給新函式增加屬性的時候就不會影響老函式。

接下來我們就只需要實現最後乙個功能:當以new的建構函式形式執行newshow時,showthis依舊是show而不是bind時傳入的obj

實現new的形式建構函式

注意我們此時並沒有改變fthis指向,我們只是修改了執行fshowthis

function.prototype.

bind

=function

(target)

vartemp

=function()

; temp.prototype = self.prototype;

f.prototype =

newtemp()

return f

}

通過以上例子我們就實現了bind原始碼內部解構,小夥伴們可以自己去試試

手寫bind原始碼

三個方法的相同點 目標函式被呼叫時,改變this的指向的值 三個方法都是函式的方法,掛在在function.prototype上 不同點 目標函式呼叫bind後,不會立即執行,而是返回乙個新的函式,呼叫新函式才會執行目標函式 自定義乙個類似於bind函式的函式,將其掛載到函式function上面,然...

Vue 原始碼閱讀(七) bind

class demo resize init new demo 執行後,縮放瀏覽器,此時彈窗顯示undefined。符合預期!import vue from vue new vue methods mounted 縮放瀏覽器,此時彈框顯示1。不符合預期!按常理,繫結事件this.resize後,將會...

Bind2nd原始碼解析

例 transform coll1.begin coll1.end back inserter coll2 bind2nd multiplies 10 1 呼叫模板函式bind2nd,第乙個引數為multiplies臨時物件。template function bind2nd templateinl...