Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
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.