你不知道的js——bind功能及實現

假如有下列代碼

function A(){} 
var o = {}; 
var x = 1; 
var y = 2; 
var z = 3; 
var B = A.bind(o,x,y); 
B('c')

 

首先,bing函數的作用:

  1. 函數A調用bind方法時,需要傳遞的參數爲 o, x, y,z.....
  2. 返回新的函數B
  3. 函數B在執行時,實際的函數功能還是A的功能,只不過函數內部this的指向變爲了參數o,如果沒有參數,則this的指向還是window
  4. 函數B在執行時,傳遞的參數會拼接到x,y的後面,一併在內部傳遞給A執行
  5. new B()時的構造函數依舊是A,A函數內部this指向不會發生改變,o不起任何作用。

寫一個newBing()方法,實現bing的功能。

Function.prototype.newBing = function(target){
    //target改變返回函數執行的this指向
    var self = this;//誰調用,this指向誰,此處將self=調用newBing的函數
    var args = [].slice.call(arguments,1);//此處見他人博客  cichuhttps://blog.csdn.net/u011402896/article/details/79546268
    var temp = function(){};  //緩衝函數(聖盃模式)
    var f = function(){
        var _arg = [].slice.call(arguments,0); //此處是函數B執行時的參數
        //真正執行的是調用newBing的函數
        return self.apply(this instanceof temp ? this : (target || window),args.concat(_arg));  //apply將方法內部的this指向改變爲第一個參數,詳細見 原型鏈 call/apply 繼承模式   http://note.youdao.com/noteshare?id=7d5b99baf295b3499a49681cfdf72837
    // instanceof  是表示this能否在原型鏈上找到自己的原型temp,實現5的功能
    }
    temp.prototype = self.prototype;
    f.prototype = new temp();     //建立繼承關係,聖盃模式    以f爲構造函數去創建出的對象,能找到self.  實現5的功能。
    return f;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章