Commit 1d2b1a57 authored by jeresig's avatar jeresig

Added in jQuery.proxy(obj, name), like the method described in Secrets of the...

Added in jQuery.proxy(obj, name), like the method described in Secrets of the JavaScript Ninja and in Dojo's Hitch, and added in some unit tests.
parent a5dbca4a
...@@ -618,17 +618,28 @@ jQuery.extend({ ...@@ -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;
......
...@@ -839,3 +839,22 @@ test("jQuery.isEmptyObject", function(){ ...@@ -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" )();
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment