精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Js 實現 Bind 的這五層,你在第幾層?

開發 前端
最近在幫女朋友復習 JS 相關的基礎知識,遇到不會的問題,她就會來問我。

 [[398743]]

本文轉載自微信公眾號「秋風的筆記」,作者藍色的秋風 。轉載本文請聯系秋風的筆記公眾號。

最近在幫女朋友復習 JS 相關的基礎知識,遇到不會的問題,她就會來問我。

這不是很簡單?三下五除二,分分鐘解決。

  1. function bind(fn, obj, ...arr) { 
  2.  return fn.apply(obj, arr) 

于是我就將這段代碼發了過去

這時候立馬被女朋友進行了一連串的靈魂拷問。

這個時候,我馬老師就坐不住了,我不服氣,我就去復習了一下 bind,發現太久不寫基礎代碼,還是會需要一點時間復習,這一次我得寫一個有深度的 bind,深得馬老師的真傳,給他分成了五層速記法。

[[398746]]

第一層 - 綁定在原型上的方法

這一層非常的簡單,得益于 JS 原型鏈的特性。由于 function xxx 的原型鏈 指向的是 Function.prototype , 因此我們在調用 xxx.bind 的時候,調用的是 Function.prototype 上的方法。

  1. Function.prototype._bind = function() {} 

這樣,我們就可以在一個構造函數上直接調用我們的bind方法啦~例如像這樣。

  1. funciton myfun(){} 
  2. myfun._bind(); 

想要詳細理解這方面的可以看這張圖和這篇文章(https://github.com/mqyqingfeng/blog/issues/2)

第二層 - 改變 this 的指向

這可以說是 bind 最核心的特性了,就是改變 this 的指向,并且返回一個函數。而改變 this , 我們可以通過已知的 apply 和 call 來實現,這里我們就暫且使用 apply 來進行模擬。首先通過 self 來保存當前 this,也就是傳入的函數。因為我們知道 this 具有 隱式綁定的規則(摘自 《你不知道的JavaScript(上)》2.2.2 ),

  1. function foo() {console.log(this.a)} 
  2. var obj = {a: 2, foo}; 
  3. obj.foo(); // 2 

通過以上特性,我們就可以來寫我們的 _bind 函數。

  1. Function.prototype._bind = function(thisObj) { 
  2.  const self = this; 
  3.  return function () { 
  4.     self.apply(thisObj); 
  5.   } 
  6. var obj = {a:1} 
  7. function myname() {console.log(this.a)} 
  8. myname._bind(obj)(); // 1 

可能很多朋友都止步于此了,因為在一般的面試中,特別是一些校招面試中,可能你只需要知道前面兩個就差不多了。但是想要在面試中驚艷所有人,仍然是不夠的,接下來我們繼續我們的探索與研究。

第三層 - 支持柯里化

函數柯里化是一個老生常談的話題,在這里再復習一下。

  1. function fn(x) { 
  2.  return function (y) { 
  3.   return x + y; 
  4.  } 
  5. var fn1 = fn(1); 
  6. fn1(2) // 3 

不難發現,柯里化使用了閉包,當我們執行 fn1 的時候,函數內使用了外層函數的 x, 從而形成了閉包。

而我們的 bind 函數也是類似,我們通過獲取當前外部函數的 arguments ,并且去除了綁定的對象,保存成變量 args,最后 return 的方法,再一次獲取當前函數的 arguments, 最終用 finalArgs 進行了一次合并。

  1. Function.prototype._bind = function(thisObj) { 
  2.  const self = this; 
  3.   const args = [...arguments].slice(1) 
  4.  return function () { 
  5.     const finalArgs = [...args, ...arguments] 
  6.     self.apply(thisObj, finalArgs); 
  7.   } 

通過以上代碼,讓我們 bind 方法,越來越健壯了。

  1. var obj = { i: 1} 
  2. function myFun(a, b, c) { 
  3.   console.log(this.i + a + b + c); 
  4. var myFun1 = myFun._bind(obj, 1, 2); 
  5. myFun1(3); // 7 

一般到了這層,可以說非常棒了,但是再堅持一下下,就變成了完美的答卷。

第四層 - 考慮 new 的調用

要知道,我們的方法,通過 bind 綁定之后,依然是可以通過 new 來進行實例化的, new 的優先級會高于 bind(摘自 《你不知道的JavaScript(上)》2.3 優先級)。

這一點我們通過原生 bind 和我們第四層的 _bind 來進行驗證對比。

  1. // 原生 
  2. var obj = { i: 1} 
  3. function myFun(a, b, c) { 
  4.   // 此處用new方法,this指向的是當前函數 myFun  
  5.   console.log(this.i + a + b + c); 
  6. var myFun1 = myFun.bind(obj, 1, 2); 
  7. new myFun1(3); // NAN 
  8.  
  9. // 第四層的 bind 
  10. var obj = { i: 1} 
  11. function myFun(a, b, c) { 
  12.   console.log(this.i + a + b + c); 
  13. var myFun1 = myFun._bind(obj, 1, 2); 
  14. new myFun1(3); // 7 

注意,這里使用的是 bind方法

因此我們需要在 bind 內部,對 new 的進行處理。而 new.target 屬性,正好是用來檢測構造方法是否是通過 new 運算符來被調用的。

接下來我們還需要自己實現一個 new ,

而根據 MDN,new 關鍵字會進行如下的操作:

1.創建一個空的簡單JavaScript對象(即{});

2.鏈接該對象(設置該對象的constructor)到另一個對象 ;

3.將步驟1新創建的對象作為this的上下文 ;

4.如果該函數沒有返回對象,則返回this。

  1. Function.prototype._bind = function(thisObj) { 
  2.  const self = this; 
  3.   const args = [...arguments].slice(1); 
  4.  return function () { 
  5.     const finalArgs = [...args, ...arguments]; 
  6.   // new.target 用來檢測是否是被 new 調用 
  7.     if(new.target !== undefined) { 
  8.       // this 指向的為構造函數本身 
  9.       var result = self.apply(this, finalArgs); 
  10.       // 判斷改函數是否返回對象 
  11.       if(result instanceof Object) { 
  12.         return reuslt; 
  13.       } 
  14.       // 沒有返回對象就返回 this 
  15.       return this; 
  16.     } else { 
  17.       // 如果不是 new 就原來的邏輯 
  18.       return self.apply(thisArg, finalArgs); 
  19.     } 
  20.   } 

看到這里,你的造詣已經如火純情了,但是最后還有一個小細節。

第五層 - 保留函數原型

以上的方法在大部分的場景下都沒有什么問題了,但是,當我們的構造函數有 prototype 屬性的時候,就出問題啦。因此我們需要給 prototype 補上,還有就是調用對象必須為函數。

  1. Function.prototype._bind = function (thisObj) { 
  2.   // 判斷是否為函數調用 
  3.   if (typeof target !== 'function' || Object.prototype.toString.call(target) !== '[object Function]') { 
  4.     throw new TypeError(this + ' must be a function'); 
  5.   } 
  6.   const self = this; 
  7.   const args = [...arguments].slice(1); 
  8.   var bound = function () { 
  9.     var finalArgs = [...args, ...arguments]; 
  10.     // new.target 用來檢測是否是被 new 調用 
  11.     if (new.target !== undefined) { 
  12.       // 說明是用new來調用的 
  13.       var result = self.apply(this, finalArgs); 
  14.       if (result instanceof Object) { 
  15.         return result; 
  16.       } 
  17.       return this; 
  18.     } else { 
  19.       return self.apply(thisArg, finalArgs); 
  20.     } 
  21.   }; 
  22.   if (self.prototype) { 
  23.     // 為什么使用了 Object.create? 因為我們要防止,bound.prototype 的修改而導致self.prototype 被修改。不要寫成 bound.prototype = self.prototype; 這樣可能會導致原函數的原型被修改。 
  24.     bound.prototype = Object.create(self.prototype); 
  25.     bound.prototype.constructor = self; 
  26.   } 
  27.   return bound; 
  28. }; 

以上就是一個比較完整的 bind 實現了,如果你想了解更多細節的實踐,可以查看。(也是 MDN 推薦的)

https://github.com/Raynos/function-bind

 

責任編輯:武曉燕 來源: 秋風的筆記
相關推薦

2021-12-10 09:11:36

TypeScript 函數重載 TS 前端

2022-08-29 08:48:59

Go函數工廠模式

2021-12-16 06:52:33

Ceph分布式對象

2021-10-29 21:26:39

前端引擎層類型

2009-05-25 15:00:20

2024-03-15 08:21:17

bindJavaScrip函數

2016-09-23 16:09:01

2022-04-05 11:29:40

Linux安裝操作系統

2022-01-18 16:42:03

區塊鏈加密信息資源

2021-12-01 06:40:32

Bind原理實現

2012-06-21 15:50:20

JavaScript

2009-01-14 17:46:01

RHELBindDNS

2022-03-07 10:22:07

DevOps開發工具

2023-04-24 08:11:02

圖片alt語音

2024-11-14 07:20:00

2025-04-03 09:56:40

Python算法開發

2016-08-22 23:56:48

超融合HCI

2016-03-28 17:00:32

互聯網運維體系運維

2022-07-08 08:21:26

JSbind 方法

2015-08-18 09:52:19

app推廣規劃
點贊
收藏

51CTO技術棧公眾號

精品人体无码一区二区三区| 国产福利影院在线观看| 黄色av中文字幕| 久久久久欧美精品| 精品国产一区二区三区久久狼黑人 | av亚洲在线观看| 欧美一区二区在线不卡| 国产肥臀一区二区福利视频| 幼a在线观看| 北条麻妃国产九九精品视频| 国产精品日日做人人爱| 久久久久久欧美精品se一二三四| 国产成人精品三级高清久久91| 7777精品伊人久久久大香线蕉的| 成人免费aaa| 国产视频中文字幕在线观看| 91久色porny| 97超碰人人看人人 | 日本片在线观看| 日本一区二区综合亚洲| 久久国产精品 国产精品| 亚洲天堂狠狠干| 国产欧美精品久久| 欧美另类高清videos| 欧美人妻一区二区三区| 久久精品福利| 91精品国产综合久久久久久久久久 | 天使萌一区二区三区免费观看| 欧美成人合集magnet| 少妇的滋味中文字幕bd| 久操成人av| 亚洲激情小视频| 一区二区三区欧美精品| 国产亚洲一区二区手机在线观看| 亚洲成人高清在线| 黄色一级片av| 免费观看成人高潮| 欧美高清在线精品一区| 日本不卡久久| 酒色婷婷桃色成人免费av网| 99久久视频| 亚洲人成电影网站色…| 又黄又爽的网站| 日韩成人精品| 884aa四虎影成人精品一区| 热久久精品免费视频| 水蜜桃在线视频| 性欧美疯狂xxxxbbbb| 国产肉体ⅹxxx137大胆| 羞羞视频在线免费国产| 亚洲精品乱码久久久久| 欧美大片免费播放| 污的网站在线观看| 亚洲一区在线视频观看| 国产在线拍揄自揄拍无码| xvideos国产在线视频| 亚洲日本电影在线| 国产高清精品软男同| 欧美被日视频| 亚洲激情成人在线| 久草视频这里只有精品| √8天堂资源地址中文在线| 亚洲男人的天堂在线aⅴ视频| 艳母动漫在线观看| 亚洲欧美成人影院| 午夜精品一区在线观看| 国产素人在线观看| 亚洲wwww| 欧美日韩成人高清| 奇米777在线| 爱高潮www亚洲精品| 日韩午夜在线影院| 日本在线不卡一区二区| 婷婷五月色综合香五月| 亚洲人成亚洲人成在线观看| 性爱在线免费视频| 你懂的亚洲视频| 午夜剧场成人观在线视频免费观看| 亚洲国产成人精品激情在线| 丝袜国产日韩另类美女| 国产欧美日韩精品在线观看| 精品国产亚洲av麻豆| 成人性生交大片免费看视频在线| 免费h精品视频在线播放| 亚洲s色大片| 亚洲综合色区另类av| 男人日女人bb视频| 亚洲国产91视频| 亚洲成人激情图| 一级片视频免费看| 亚洲精品小说| 清纯唯美亚洲激情| 91好色先生tv| 91老师国产黑色丝袜在线| 先锋在线资源一区二区三区| 国产最新在线| 欧美日韩精品国产| 五月天婷婷在线观看视频| 国产一区二区三区亚洲| 日韩在线免费视频| 中日韩精品视频在线观看| 麻豆成人免费电影| 国产一区二区三区无遮挡| 香港伦理在线| 欧美性猛xxx| 亚洲综合123| 精品产国自在拍| 国内外成人免费激情在线视频网站 | 国产精品欧美久久久| 亚洲av无码乱码在线观看性色 | 亚洲精品456在线播放狼人| 黄色国产在线播放| 99这里有精品| 91成人免费观看| 97超碰国产一区二区三区| 午夜成人免费电影| 三大队在线观看| 99久久www免费| 国产v综合v亚洲欧美久久| www.香蕉视频| 亚洲人被黑人高潮完整版| 免费看a级黄色片| 女仆av观看一区| 欧美另类交人妖| 国产精品人人爽| 中文字幕精品一区二区三区精品| 国产午夜福利视频在线观看| 影音先锋欧美激情| 欧美成人全部免费| 在线观看日韩一区二区| 国产亚洲精品福利| 色欲av无码一区二区人妻| 超碰97久久| 欧美成人sm免费视频| 一区二区视频播放| 中文字幕精品—区二区四季| 国产精品97在线| 日韩手机在线| 日韩av大片免费看| 日本午夜在线视频| 欧美日韩另类视频| 丰满大乳奶做爰ⅹxx视频| 亚洲第一毛片| 狠狠久久综合婷婷不卡| 国产丝袜在线观看视频| 精品乱码亚洲一区二区不卡| 日本天堂中文字幕| 国产精品一卡二| www.欧美黄色| 北条麻妃在线一区二区免费播放| 久久久久久久久久久成人| 亚洲xxx在线| 亚洲成人免费看| 国产传媒第一页| 视频一区二区中文字幕| 视频一区视频二区视频三区高 | 91传媒视频免费| 在线中文字幕电影| 亚洲第一男人天堂| www.日本精品| 久久久综合视频| 国产三区在线视频| 日韩精品免费| 91久久久在线| 岛国片av在线| 日韩精品在线第一页| 亚洲av无码精品一区二区| 国产精品毛片大码女人| 午夜精品久久久久久久99热影院| 中文字幕一区二区三区久久网站| 粉嫩高清一区二区三区精品视频| 男人天堂亚洲天堂| 精品亚洲国产视频| 中日韩av在线| 亚洲国产毛片aaaaa无费看| 国产精品无码网站| 美腿丝袜亚洲色图| 精品国产一区二区三区无码| 国产成人精品三级高清久久91| 国产精品影片在线观看| 免费在线中文字幕| 亚洲三级黄色在线观看| 国产精品无码一区二区桃花视频| 亚洲香肠在线观看| www色com| 日本视频在线观看免费| 国内精品写真在线观看| 日韩亚洲欧美视频| 成人在线亚洲| 高清不卡日本v二区在线| 欧美成人性网| 欧美成人免费观看| 国内三级在线观看| 日韩欧美高清在线| 波多野结衣视频在线观看| 一区二区视频在线| 精品无码在线观看| 成人黄色在线网站| 日韩一级免费片| 在线综合亚洲| 亚洲av综合色区| 美女久久99| 91福利视频导航| 玖玖精品在线| 国产91在线播放| 九色91在线| 精品国产一区二区三区久久狼黑人 | 在线视频一区观看| 外国成人在线视频| 97久久精品午夜一区二区| 成人看片在线观看| 91tv亚洲精品香蕉国产一区7ujn| 91最新在线视频| 中文欧美在线视频| 你懂的在线观看视频网站| 欧美精品一区二区久久久| 亚洲一区二区人妻| 色欲综合视频天天天| 69精品久久久| 亚洲精品亚洲人成人网在线播放| 级毛片内射视频| 99re在线精品| 激情av中文字幕| 狠狠色综合播放一区二区| 国产v亚洲v天堂无码久久久| 国产亚洲一区在线| 青青青在线观看视频| 外国成人免费视频| 伊人久久大香线蕉午夜av| 国产一区二区三区91| 久久99精品久久久久久久青青日本 | 男人天堂手机在线| 中文字幕精品www乱入免费视频| 神马久久精品| 日韩av中文在线| 人妻少妇精品无码专区久久| 欧美大黄免费观看| 精品久久久久中文慕人妻| 7777精品伊人久久久大香线蕉完整版| 亚洲视频在线观看免费视频| 欧美视频一区在线| 中文字幕人成人乱码亚洲电影| 91成人看片片| 午夜婷婷在线观看| 91国产福利在线| 波多野结衣黄色| 欧美性感一类影片在线播放| 波多野结衣在线观看视频| 在线看日本不卡| 国产偷人爽久久久久久老妇app| 欧美午夜视频网站| 亚洲一区在线观| 91精品国产黑色紧身裤美女| a在线观看免费| 精品福利av导航| 五月婷婷六月丁香综合| 亚洲美女激情视频| 国产网站在线播放| 日韩在线国产精品| 自拍亚洲图区| 久久久亚洲影院你懂的| 蜜臀久久精品| 国产精品国产自产拍高清av水多| 亚洲爱爱视频| 91香蕉亚洲精品| 国产精品传媒| 色播亚洲婷婷| 一本一道久久a久久精品蜜桃 | 女人18毛片毛片毛片毛片区二 | 中文字幕一区二区在线视频| 欧美福利电影网| 蜜臀av免费在线观看| 国产网站欧美日韩免费精品在线观看| 黄色大片在线看| 欧美剧在线观看| 桃色av一区二区| 成人免费激情视频| 动漫视频在线一区| 日韩欧美一区二区三区四区五区| 国产精品久久久久9999赢消| 欧美国产综合在线| 视频一区视频二区中文字幕| 成年人网站av| 久久老女人爱爱| 真实国产乱子伦对白在线| 欧美性xxxxhd| 99视频国产精品免费观看a| 日韩电影免费在线观看中文字幕| 在线免费看黄| 97精品国产97久久久久久春色| h1515四虎成人| 国产精品区二区三区日本| 精品毛片免费观看| 欧美高清中文字幕| 免费成人在线视频观看| 无码精品一区二区三区在线播放| 国产精品美女www爽爽爽| 天天操天天爽天天干| 欧美日韩国产精选| 欧美日韩影视| 久久久久国产精品免费| 97欧美成人| 精品不卡一区二区三区| 亚洲精品国产首次亮相| 国产xxxxx视频| av男人天堂一区| 可以直接看的黄色网址| 欧洲一区二区三区在线| 天堂av2024| 欧美尺度大的性做爰视频| 秋霞国产精品| 精品国产一二| 欧美日韩三级电影在线| 中文字幕中文在线| 国产欧美一区视频| 五月婷婷视频在线| 精品第一国产综合精品aⅴ| 国产在线观看a| 国产精品亚洲精品| 狠狠做六月爱婷婷综合aⅴ | 精品肉丝脚一区二区三区| 欧美日韩中文国产| 国产原创av在线| 欧洲美女7788成人免费视频| jizz性欧美2| 亚洲精品国产suv一区88| 狠狠色丁香婷综合久久| 亚洲一级理论片| 欧美性受xxxx黑人xyx性爽| 你懂的在线视频| 日本免费久久高清视频| 女仆av观看一区| 免费在线a视频| 91免费观看在线| 色婷婷在线观看视频| 精品国一区二区三区| 好吊日av在线| 国产精品国产三级欧美二区| 欧美成人亚洲| 国产精品99久久久精品无码| 亚洲精品水蜜桃| www.蜜臀av.com| 久久久久久国产精品美女| 91亚洲无吗| 国产 日韩 亚洲 欧美| 成人黄色大片在线观看| 日韩av女优在线观看| 亚洲丁香久久久| 日韩脚交footjobhdboots| 久久国产精品免费一区| 久久三级视频| 日本二区在线观看| 欧美三片在线视频观看| 午夜毛片在线| 亚洲自拍中文字幕| 影音先锋一区| 免费在线观看你懂的| 在线亚洲免费视频| 日本在线免费网| 亚洲一区二区三区成人在线视频精品| 欧美日韩ab| 好吊色视频一区二区三区| 欧美性猛交xxxx乱大交蜜桃| 韩国三级在线观看久| 国产欧美日韩视频| 女人色偷偷aa久久天堂| 成人区人妻精品一区二| 色综合中文字幕| av在线播放网| 69堂成人精品视频免费| 亚洲激情综合| 妺妺窝人体色WWW精品| 欧美一区二区三区在线观看| 波多野结衣精品| 日韩欧美三级电影| 国产一区二区三区免费播放| 日韩欧美视频在线免费观看| 亚洲视频综合网| 欧美日本三级| 日本在线观看a| 亚洲人123区| 欧美xxx.com| 亚洲在线视频福利| 午夜影院日韩| 亚洲波多野结衣| 亚洲欧美国内爽妇网| 91精品国产自产观看在线| 日韩伦理在线免费观看| 中文字幕欧美日韩一区| 日本精品一二区| 国产精品一区二区性色av| 亚洲三级视频| 黄色录像一级片| 日韩精品视频中文在线观看| 视频欧美精品| 日韩av一二三四区| 一区二区三区在线免费播放| 国产69精品久久app免费版| 不卡视频一区二区三区| 美女国产一区二区三区|