手寫實現bind

2022-09-08 16:30:26 字數 2859 閱讀 9570

bind() 方法會建立乙個新函式。當這個新函式被呼叫時,bind() 的第乙個引數將作為它執行時的 this,之後的一串行引數將會在傳遞的實參前傳入作為它的引數。(來自於 mdn )

由此我們可以首先得出 bind 函式的兩個特點:

返回乙個函式

可以傳入引數

返回函式的模擬實現

從第乙個特點開始,我們舉個例子:

var foo =

;function

bar(

)// 返回了乙個函式

var bindfoo = bar.

bind

(foo)

;bindfoo()

;// 1

// 第一版

function.prototype.

bind2

=function

(context)

}

var foo =

;function

bar(

)var bindfoo = bar.

bind

(foo)

;console.

log(

bindfoo()

);// 1

傳參的模擬實現

接下來看第二點,可以傳入引數。這個就有點讓人費解了,我在 bind 的時候,是否可以傳參呢?我在執行 bind 返回的函式的時候,可不可以傳參呢?讓我們看個例子:

var foo =

;function

bar(name, age)

var bindfoo = bar.

bind

(foo,

'daisy');

bindfoo

('18');

// 1

// daisy

// 18

函式需要傳 name 和 age 兩個引數,竟然還可以在 bind 的時候,只傳乙個 name,在執行返回的函式的時候,再傳另乙個引數 age!

這可咋辦?不急,我們用 arguments 進行處理:

// 第二版

function.prototype.

bind2

=function

(context)

}

建構函式效果的模擬實現

完成了這兩點,最難的部分到啦!因為 bind 還有乙個特點,就是

乙個繫結函式也能使用new操作符建立物件:這種行為就像把原函式當成構造器。提供的 this 值被忽略,同時呼叫時的引數被提供給模擬函式。

也就是說當 bind 返回的函式作為建構函式的時候,bind 時指定的 this 值會失效,但傳入的引數依然生效。舉個例子:

var value =2;

var foo =

;function

bar(name, age)

bar.prototype.friend =

'kevin'

;var bindfoo = bar.

bind

(foo,

'daisy');

var obj =

newbindfoo

('18');

// undefined

// daisy

// 18

console.

log(obj.habit)

;console.

log(obj.friend)

;// shopping

// kevin

注意:儘管在全域性和 foo 中都宣告了 value 值,最後依然返回了 undefind,說明繫結的 this 失效了,如果大家了解 new 的模擬實現,就會知道這個時候的 this 已經指向了 obj。

所以我們可以通過修改返回的函式的原型來實現,讓我們寫一下:

// 第三版

function.prototype.

bind2

=function

(context)

// 修改返回函式的 prototype 為繫結函式的 prototype,例項就可以繼承繫結函式的原型中的值

fbound.prototype =

this

.prototype;

return fbound;

}

建構函式效果的優化實現

但是在這個寫法中,我們直接將 fbound.prototype = this.prototype,我們直接修改 fbound.prototype 的時候,也會直接修改繫結函式的 prototype。這個時候,我們可以通過乙個空函式來進行中**

// 第四版

function.prototype.

bind2

=function

(context)

var self =

this

;var args = array.prototype.slice.

call

(arguments,1)

;var

fnop

=function()

;var

fbound

=function()

fnop.prototype =

this

.prototype;

fbound.prototype =

newfnop()

;return fbound;

}

**位址鏈結

手寫實現RPC 框架

乙個簡易的rpc框架,別的先不多說上github github gitee 註冊中心 zookeeper 使用curator 操作 通訊框架 netty 4.1.25版本 序列化 kryo 以下只寫了大體專案流程,以及展示部分 具體上方github 裡基本都寫了注釋 本rpc框架,有乙個統一的 框架...

Python 純手寫 實現KNN

實現 統計學習方法 p39 例3.1 輸入 資料集,例項x,k值,以及計算距離的方法 輸出 距離最近的k個資料,以及最近距離 首先定義三種計算距離的方法 歐氏距離,曼哈頓距離,以及各個座標值的最大值 對傳入的例項x,計算再不同的距離計算方法下的最近距離,及對應的最近的座標值 import numpy...

手寫實現基礎的reactive

看一下mdn對proxy的定義 proxy 物件用於定義基本操作的自定義行為 如屬性查詢 賦值 列舉 函式呼叫等 語法 const p newproxy target,handler 所以根據proxy的特性,我們可以看到,使用了proxy,我們 的預期性會變差。看一下proxy的基本用法 let ...