Made isObjectLiteral to work correctly with custom objects with empty prototypes.
authorRobert Katic <robert.katic@gmail.com>
Thu, 12 Nov 2009 04:50:40 +0000 (12:50 +0800)
committerJohn Resig <jeresig@gmail.com>
Thu, 12 Nov 2009 13:59:47 +0000 (21:59 +0800)
src/core.js
test/unit/core.js

index 611e536..1d5a25b 100644 (file)
@@ -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 ) {
index 6bac630..b355a8c 100644 (file)
@@ -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" );