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:
parent
a5dbca4a06
commit
1d2b1a57da
25
src/core.js
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;
|
||||
|
|
|
@ -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" )();
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue