Skip to content

Commit

Permalink
Added in jQuery.proxy(obj, name), like the method described in Secret…
Browse files Browse the repository at this point in the history
…s of the JavaScript Ninja and in Dojo's Hitch, and added in some unit tests.
  • Loading branch information
jeresig committed Dec 31, 2009
1 parent a5dbca4 commit 1d2b1a5
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 7 deletions.
25 changes: 18 additions & 7 deletions src/core.js
Expand Up @@ -618,17 +618,28 @@ jQuery.extend({
guid: 1, guid: 1,


proxy: function( fn, proxy, thisObject ) { proxy: function( fn, proxy, thisObject ) {
if ( arguments.length === 2 && proxy && !jQuery.isFunction( proxy ) ) { if ( arguments.length === 2 ) {
thisObject = proxy; if ( typeof proxy === "string" ) {
proxy = undefined; thisObject = fn;
fn = thisObject[ proxy ];
proxy = undefined;

} else if ( proxy && !jQuery.isFunction( proxy ) ) {
thisObject = proxy;
proxy = undefined;
}
} }


proxy = proxy || function() { if ( !proxy && fn ) {
return fn.apply( thisObject || this, arguments ); 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 // 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 // So proxy can be declared as an argument
return proxy; return proxy;
Expand Down
19 changes: 19 additions & 0 deletions test/unit/core.js
Expand Up @@ -839,3 +839,22 @@ test("jQuery.isEmptyObject", function(){
// What about this ? // What about this ?
// equals(true, jQuery.isEmptyObject(null), "isEmptyObject on null" ); // 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" )();
});

0 comments on commit 1d2b1a5

Please sign in to comment.