From: jeresig Date: Thu, 31 Dec 2009 20:17:52 +0000 (-0500) Subject: Added in jQuery.proxy(obj, name), like the method described in Secrets of the JavaScr... X-Git-Url: http://git.asbjorn.biz/?p=jquery.git;a=commitdiff_plain;h=1d2b1a57dae0b73b3d99197f73f4edb623b5574a Added in jQuery.proxy(obj, name), like the method described in Secrets of the JavaScript Ninja and in Dojo's Hitch, and added in some unit tests. --- diff --git a/src/core.js b/src/core.js index 2c5445a..3b6cfff 100644 --- a/src/core.js +++ b/src/core.js @@ -618,17 +618,28 @@ jQuery.extend({ guid: 1, proxy: function( fn, proxy, thisObject ) { - if ( arguments.length === 2 && proxy && !jQuery.isFunction( proxy ) ) { - thisObject = proxy; - proxy = undefined; + if ( arguments.length === 2 ) { + if ( typeof proxy === "string" ) { + thisObject = fn; + fn = thisObject[ proxy ]; + proxy = undefined; + + } else if ( proxy && !jQuery.isFunction( proxy ) ) { + thisObject = proxy; + proxy = undefined; + } } - proxy = proxy || function() { - return fn.apply( thisObject || this, arguments ); - }; + 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 - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + if ( fn ) { + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + } // So proxy can be declared as an argument return proxy; diff --git a/test/unit/core.js b/test/unit/core.js index e3adc60..eb00f23 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -839,3 +839,22 @@ test("jQuery.isEmptyObject", function(){ // What about this ? // equals(true, jQuery.isEmptyObject(null), "isEmptyObject on null" ); }); + +test("jQuery.proxy", function(){ + expect(4); + + var test = function(){ equals( this, thisObject, "Make sure that scope is set properly." ); }; + var thisObject = { foo: "bar", method: test }; + + // Make sure normal works + test.call( thisObject ); + + // Basic scoping + jQuery.proxy( test, thisObject )(); + + // Make sure it doesn't freak out + equals( jQuery.proxy( null, thisObject ), undefined, "Make sure no function was returned." ); + + // Use the string shortcut + jQuery.proxy( thisObject, "method" )(); +});