bind函数:给对象绑定方法。

bind是Function的方法,js5版的,在js3中可以用代替方案模拟,但依旧有些细节没法模拟。


 /*******************************
 *bind函数在IE8中没有,兼容性代码:js权威指南(6th)P191
 ********************************/
if (!Function.prototype.bind) {
	Function.prototype.bind = function (o/*, args*/) {
		if (typeof this !== "function") {
			// closest thing possible to the ECMAScript 5 internal IsCallable function 
			throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); 
		}
		
		var self=this, boundArgs=arguments;
		return function(){
			var args=[],i;
			for(i=1; i<boundArgs.length; i++) args.push(boundArgs[i]);
			for(i=0; i<arguments.length; i++) args.push(arguments[i]);
		
			return self.apply(o, args);
		};
	}; 
} 

 /*******************************
 *bind函数在IE8中没有,兼容性代码:js权威指南(6th)P191 end
 ********************************/





 /*******************************

 *bind函数在IE8中没有,兼容性代码:某博客版

*(http://www.jb51.net/article/32837.htm)

 ********************************/

if (!Function.prototype.bind) {

Function.prototype.bind = function (oThis) {

if (typeof this !== "function") {

// closest thing possible to the ECMAScript 5 internal IsCallable function 

throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); 

}

var aArgs = Array.prototype.slice.call(arguments, 1),

fToBind = this,  fNOP = function () {}, 

fBound = function (){ 

return fToBind.apply(this instanceof fNOP && oThis?this:oThis, 

aArgs.concat(Array.prototype.slice.call(arguments))); 

};

fNOP.prototype = this.prototype; 

fBound.prototype = new fNOP(); 

return fBound; 

}; 

 /*******************************

 *bind函数在IE8兼容性代码:某博客版。结束

 ********************************/


-------------------------------------------------------------------

具体用法

-------------------------------------------------------------------



o1对象有个f方法

想让o2对象继承o1的f方法

bind一下,o2对象就有这个现成的东西了。


//o2.f = o1.f.bind(o2);


//简练的bind写法1:

var f=function(x, y){ return (x+y);}

var o={};

g=f.bind(o,1);//绑定1到x;

alert(  g(2)  );





//简练的bind写法2:

//把f函数绑定到o上,并返回一个新方法:f.bind(o);

function f(x,y){        return  x+y;    }

var o={};

//var g=f.bind(o, 1); alert( 'g 是: '+ g(3)  );

//或者

 o.m=f.bind(o, 2); alert(  o.m(10)  );

//_________________________________





//把o1的f方法绑定到o2上,并返回一个新方法:o2.f = o1.f.bind(o2);

var o1={x:1, y:3};

o1.f = function(y){

return (this.x + this.y); }

var o2={x:50, y:8};

o2.y=8;

 

o2.f =o1.f.bind(  o2 );//把o1.f绑定为o2.f

alert(  o2.f()  );



var g=o1.f.bind(  o2 );//把f绑定到o2上并返回为一个新函数

alert(  g()  );







你可能感兴趣的:(js,function)