From: Robert Katic Date: Thu, 12 Nov 2009 04:50:40 +0000 (+0800) Subject: Made isObjectLiteral to work correctly with custom objects with empty prototypes. X-Git-Url: http://git.asbjorn.it/?p=jquery.git;a=commitdiff_plain;h=990d9ca1b05a587cce7599a1a40aa2558117db41 Made isObjectLiteral to work correctly with custom objects with empty prototypes. --- diff --git a/src/core.js b/src/core.js index 611e536..1d5a25b 100644 --- a/src/core.js +++ b/src/core.js @@ -328,13 +328,20 @@ jQuery.extend({ return false; } + // not own constructor property must be Object + if ( obj.constructor + && !hasOwnProperty.call(obj, "constructor") + && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + //own properties are iterated firstly, //so to speed up, we can test last one if it is own or not - + var key; for ( key in obj ) {} - return !key || hasOwnProperty.call( obj, key ); + return key === undefined || hasOwnProperty.call( obj, key ); }, isEmptyObject: function( obj ) { diff --git a/test/unit/core.js b/test/unit/core.js index 6bac630..b355a8c 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -553,10 +553,14 @@ test("jQuery.extend(Object, Object)", function() { same( empty.foo, optionsWithDate.foo, "Dates copy correctly" ); var myKlass = function() {}; + var optionsWithCustomObject = { foo: { date: new myKlass } }; + empty = {}; + jQuery.extend(true, empty, optionsWithCustomObject); + same( empty.foo, optionsWithCustomObject.foo, "Custom objects copy correctly (no methods)" ); + // Makes the class a little more realistic myKlass.prototype = { someMethod: function(){} }; empty = {}; - var optionsWithCustomObject = { foo: { date: new myKlass } }; jQuery.extend(true, empty, optionsWithCustomObject); same( empty.foo, optionsWithCustomObject.foo, "Custom objects copy correctly" );