假如有下列代码
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;
}