Fixing $.proxy to work like (and use) Function.prototype.bind (ticket #7783)

http://bugs.jquery.com/ticket/7783
This commit is contained in:
Gianni Chiappetta 2010-12-14 21:53:04 -05:00
parent c9c9057c4d
commit 9f8cd6c499
3 changed files with 65 additions and 39 deletions

View file

@ -740,31 +740,42 @@ jQuery.extend({
// A global GUID counter for objects
guid: 1,
proxy: function( fn, proxy, thisObject ) {
if ( arguments.length === 2 ) {
if ( typeof proxy === "string" ) {
thisObject = fn;
fn = thisObject[ proxy ];
proxy = undefined;
// Bind a function to a context, optionally partially applying any
// arguments.
proxy: function( fn, context ) {
var args, proxy;
} else if ( proxy && !jQuery.isFunction( proxy ) ) {
thisObject = proxy;
proxy = undefined;
// Quick check to determine if target is callable, in the spec
// this throws a TypeError, but we will just return undefined.
if ( ! jQuery.isFunction( fn ) ) {
return undefined;
}
if ( jQuery.isFunction( Function.prototype.bind ) ) {
// Native bind
args = slice.call( arguments, 1 );
proxy = Function.prototype.bind.apply( fn, args );
} else {
// Simulated bind
args = slice.call( arguments, 2 );
if ( args.length ) {
proxy = function() {
return arguments.length ?
fn.apply( context, args.concat( slice.call( arguments ) ) ) :
fn.apply( context, args );
};
} else {
proxy = function() {
return arguments.length ?
fn.apply( context, arguments ) :
fn.call( context );
};
}
}
if ( !proxy && fn ) {
proxy = function() {
return fn.apply( thisObject || this, arguments );
};
}
// Set the guid of unique handler to the same of original handler, so it can be removed
if ( fn ) {
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
}
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
// So proxy can be declared as an argument
return proxy;
},