最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript bind函數(shù)手寫教程

 更新時間:2022年12月19日 11:04:17   作者:helloworld1024fd  
bind()方法主要就是將函數(shù)綁定到某個對象,bind()會創(chuàng)建一個函數(shù),函數(shù)體內(nèi)的this對象的值會被綁定到傳入bind()第一個參數(shù)的值,當然這是綁定哦,不是像call、apply一樣直接執(zhí)行,apply要執(zhí)行的話還得自己調(diào)用

經(jīng)常會看到網(wǎng)上各種手寫bind的教程,下面是我在自己實現(xiàn)手寫bind的過程中遇到的問題與思考。如果對于如何實現(xiàn)一個手寫bind還有疑惑的話,那么可以先看看上面兩篇文章。

手寫bind vs 原生bind

我們先使用一個典型的手寫bind的例子,代碼如下:

Function.prototype.bind2 = function (context) {
    if (typeof this !== "function") {
      throw new Error("Function.prototype.bind - what is trying to be bound is not callable");
    }
    var self = this;
    var args = Array.prototype.slice.call(arguments, 1);
    var fNOP = function () {};
    var fBound = function () {
        var bindArgs = Array.prototype.slice.call(arguments);
        return self.apply(this instanceof fNOP ? this : context, args.concat(bindArgs));
    }
    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();
    return fBound;
}

我們首先用原生bind運行一下代碼

function Foo(a) {this.a = a}
Foo.prototype.sayHi = function( ) {}
let _Foo = Foo.bind(undefined, 'a')
new _Foo() 

更多面試題解答參見前端手寫面試題詳細解答

然后使用手寫版代碼,運行同樣的代碼

function Foo(a) {this.a = a}
Foo.prototype.sayHi = function( ) {}
let _Foo = Foo.bind2(undefined, 'a')
new _Foo() 

我們可以看到相比原生bind方法,手寫版的bind方法返回的構(gòu)造函數(shù),構(gòu)造出來的新對象會比原生的多一層__proto__。而這個__proto__產(chǎn)生的原因就是在很多教程中提到的防止原型鏈篡改。

這也就是為什么很多的文章會告訴你,為什么要添加下面的代碼。

var fNOP = function () {};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();

這段代碼中,使用了一個空函數(shù)作為中轉(zhuǎn),相當于Object.create(fBound.prototype)。具體可以查看文章開頭給出的文章,里面的詳細的說明。

規(guī)范中的bind

既然說道,加上面的代碼是為了防止原型鏈篡改。我就想看看原生的bind如何處理這個問題的呢?

function Foo(a) {this.a = a}
Foo.prototype.sayHi = function( ) {}
let _Foo = Foo.bind(undefined, 'a')
_Foo.prototype.sayHi = function( ) {console.log('篡改的_Foo的sayHi方法')}
(new _Foo().sayHi())

我發(fā)現(xiàn)在運行上面的代碼,程序執(zhí)行到修改_Foo的原型方法的語句時,就已經(jīng)報錯了。提示表明_Foo沒有prototype屬性!既然沒有prototype屬性,那么是不是也就不用處理原型鏈篡改的問題了呢?

之后,我查了一下規(guī)范, 在NOTE中,有下面一段話。明確指出了bind返回的函數(shù)是沒有prototype屬性,這也多少印證了上面的猜想。

Function objects created using Function.prototype.bind do not have a prototype property or the [[Code]], [[FormalParameters]], and [[Scope]] internal properties.

其中需要注意的有一點是這條:

Set the [[Prototype]] internal property of F to the standard built-in Function prototype object as specified in 15.3.3.1.

我自己理解的意思是是bind出來的函數(shù)對象的prototype屬性是內(nèi)建的Function.prototype屬性, 這里應(yīng)該是說明了為什么原生的bind不會多一層__proto__屬性

小結(jié)

寫這篇的目的是總結(jié)下自己在實現(xiàn)bind過程中遇到的問題,記錄探究的過程。通過一系列手寫原生方法,鍛煉了我們對于原理的進一步認識。但是也要注意驗證,實際去操作幾次,可能得出自己的經(jīng)驗。如果有更多的兩者對比的發(fā)現(xiàn),可以在評論里告訴我,歡迎各位大佬斧正。

到此這篇關(guān)于JavaScript bind函數(shù)手寫教程的文章就介紹到這了,更多相關(guān)JS bind函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript順序加載圖片的方法

    javascript順序加載圖片的方法

    這篇文章主要介紹了javascript順序加載圖片的方法,可實現(xiàn)javascript針對圖片的逐次加載,從而減緩服務(wù)器壓力,非常具有實用價值,需要的朋友可以參考下
    2015-07-07
  • layer彈出層取消遮罩的方法

    layer彈出層取消遮罩的方法

    今天小編就為大家分享一篇layer彈出層取消遮罩的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JavaScript腳本延遲加載有哪些方式

    JavaScript腳本延遲加載有哪些方式

    本文主要介紹了JavaScript腳本延遲加載有哪些方式,主要介紹了五種方式,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • 詳解原生JavaScript實現(xiàn)jQuery中AJAX處理的方法

    詳解原生JavaScript實現(xiàn)jQuery中AJAX處理的方法

    這篇文章主要介紹了原生JavaScript實現(xiàn)jQuery中AJAX處理的方法,作者根據(jù)jQuery中一些對AJAX請求的處理方式來用原生API實現(xiàn),需要的朋友可以參考下
    2016-05-05
  • 純JavaScript 實現(xiàn)flappy bird小游戲?qū)嵗a

    純JavaScript 實現(xiàn)flappy bird小游戲?qū)嵗a

    這篇文章主要介紹了純JavaScript 實現(xiàn)flappy bird小游戲?qū)嵗a,b本文分七大步驟給大家介紹,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • createTextRange()的使用示例含文本框選中部分文字內(nèi)容

    createTextRange()的使用示例含文本框選中部分文字內(nèi)容

    這篇文章主要介紹了createTextRange()的使用示例,需要的朋友可以參考下
    2014-02-02
  • Javascript this 的一些學(xué)習(xí)總結(jié)

    Javascript this 的一些學(xué)習(xí)總結(jié)

    相信有C++、C#或Java等編程經(jīng)驗的各位,對于this關(guān)鍵字再熟悉不過了。由于Javascript是一種面向?qū)ο蟮木幊陶Z言,它和C++、C#或Java一樣都包含this關(guān)鍵字,接下來我們將向大家介紹Javascript中的this關(guān)鍵字
    2012-08-08
  • 微信小程序表單驗證錯誤提示效果

    微信小程序表單驗證錯誤提示效果

    這篇文章主要為大家詳細介紹了微信小程序表單驗證錯誤提示效果,點擊確認發(fā)布不能為空錯誤提示,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • javascript作用域容易記錯的兩個地方分析

    javascript作用域容易記錯的兩個地方分析

    javascript作用域容易記錯的兩個地方分析,學(xué)習(xí)js的朋友可以參考下
    2012-06-06
  • JS中appendChild追加子節(jié)點無效的解決方法

    JS中appendChild追加子節(jié)點無效的解決方法

    這篇文章主要給大家介紹了關(guān)于JS中appendChild追加子節(jié)點無效的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)
    2018-10-10

最新評論

伊春市| 疏附县| 台东市| 壤塘县| 濉溪县| 荥阳市| 雅安市| 米林县| 左云县| 西吉县| 临沂市| 榕江县| 公主岭市| 维西| 天水市| 肥城市| 手游| 张掖市| 上饶市| 广元市| 黄大仙区| 云南省| 凉山| 黎平县| 泸西县| 新绛县| 龙口市| 惠来县| 衡南县| 兰溪市| 滨州市| 砀山县| 壶关县| 阳谷县| 布拖县| 图片| 广南县| 吴堡县| 龙山县| 长宁区| 天台县|