Skip to content
Permalink
Browse files
Added in jQuery.proxy(obj, name), like the method described in Secret…
…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.
@@ -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;
@@ -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" )();
});

0 comments on commit 1d2b1a5

Please sign in to comment.