Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
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...
commit 1d2b1a57dae0b73b3d99197f73f4edb623b5574a 1 parent a5dbca4
@jeresig jeresig authored
Showing with 37 additions and 7 deletions.
  1. +18 −7 src/core.js
  2. +19 −0 test/unit/core.js
View
25 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;
View
19 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" )();
+});
Please sign in to comment.
Something went wrong with that request. Please try again.