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
15
src/core.js
15
src/core.js
|
@ -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 ) {
|
||||||
|
if ( typeof proxy === "string" ) {
|
||||||
|
thisObject = fn;
|
||||||
|
fn = thisObject[ proxy ];
|
||||||
|
proxy = undefined;
|
||||||
|
|
||||||
|
} else if ( proxy && !jQuery.isFunction( proxy ) ) {
|
||||||
thisObject = proxy;
|
thisObject = proxy;
|
||||||
proxy = undefined;
|
proxy = undefined;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
proxy = proxy || function() {
|
if ( !proxy && fn ) {
|
||||||
|
proxy = function() {
|
||||||
return fn.apply( thisObject || this, arguments );
|
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
|
||||||
|
if ( fn ) {
|
||||||
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
|
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(){
|
||||||
// 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" )();
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in a new issue