From 1d2b1a57dae0b73b3d99197f73f4edb623b5574a Mon Sep 17 00:00:00 2001 From: jeresig Date: Thu, 31 Dec 2009 15:17:52 -0500 Subject: [PATCH] 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. --- src/core.js | 25 ++++++++++++++++++------- test/unit/core.js | 19 +++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/core.js b/src/core.js index 2c5445ab9..3b6cfff45 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 e3adc604f..eb00f23a6 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" )(); +}); -- 2.39.5