Added in jQuery.proxy(obj, name), like the method described in Secrets of the JavaScr...
authorjeresig <jeresig@gmail.com>
Thu, 31 Dec 2009 20:17:52 +0000 (15:17 -0500)
committerjeresig <jeresig@gmail.com>
Thu, 31 Dec 2009 20:17:52 +0000 (15:17 -0500)
src/core.js
test/unit/core.js

index 2c5445a..3b6cfff 100644 (file)
@@ -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;
index e3adc60..eb00f23 100644 (file)
@@ -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" )();
+});