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.

This commit is contained in:
jeresig 2009-12-31 15:17:52 -05:00
parent a5dbca4a06
commit 1d2b1a57da
2 changed files with 37 additions and 7 deletions

View file

@ -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 file

@ -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" )();
});