前言
在了解怎麼實現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的功能,只不過show
的this
改為了target
。如果不任何引數,那麼show
的this
指向window
4. 函式newshow在執行的時候可以傳遞引數,並且傳遞的引數會拼接到bind的時候傳遞的引數後面
5. 當以new
的建構函式形式執行newshow時,show
的this
依舊是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時,show
的this
依舊是show
而不是bind時傳入的obj
實現new的形式建構函式
注意我們此時並沒有改變f
的this
指向,我們只是修改了執行f
時show
的this
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...