假如有下列代碼
function A(){}
var o = {};
var x = 1;
var y = 2;
var z = 3;
var B = A.bind(o,x,y);
B('c')
首先,bing函數的作用:
- 函數A調用bind方法時,需要傳遞的參數爲 o, x, y,z.....
- 返回新的函數B
- 函數B在執行時,實際的函數功能還是A的功能,只不過函數內部this的指向變爲了參數o,如果沒有參數,則this的指向還是window
- 函數B在執行時,傳遞的參數會拼接到x,y的後面,一併在內部傳遞給A執行
- 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;
}