From 990d9ca1b05a587cce7599a1a40aa2558117db41 Mon Sep 17 00:00:00 2001 From: Robert Katic Date: Thu, 12 Nov 2009 12:50:40 +0800 Subject: [PATCH] Made isObjectLiteral to work correctly with custom objects with empty prototypes. --- src/core.js | 11 +++++++++-- test/unit/core.js | 6 +++++- 2 files changed, 14 insertions(+), 3 deletions(-) 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" ); -- 1.7.10.4