Made isObjectLiteral to work correctly with custom objects with empty prototypes.
[jquery.git] / src / core.js
index b1dde53..1d5a25b 100644 (file)
@@ -32,13 +32,14 @@ var jQuery = function( selector, context ) {
        rtrim = /^\s+|\s+$/g,
 
        // Match a standalone tag
-       rsingleTag = /^<(\w+)\s*\/?>$/,
+       rsingleTag = /<(\w+)\s*\/?>(?:<\/\1>)?$/,
 
        // Keep a UserAgent string for use with jQuery.browser
        userAgent = navigator.userAgent.toLowerCase(),
 
        // Save a reference to some core methods
        toString = Object.prototype.toString,
+       hasOwnProperty = Object.prototype.hasOwnProperty,
        push = Array.prototype.push,
        slice = Array.prototype.slice,
        indexOf = Array.prototype.indexOf;
@@ -52,15 +53,10 @@ jQuery.fn = jQuery.prototype = {
                        return this;
                }
 
-               // $("body"): Shortcut for quickly finding the body element
-               if ( selector === "body" && !context && document.body ) {
-                       selector = document.body;
-               }
-
                // Handle $(DOMElement)
                if ( selector.nodeType ) {
                        this.context = this[0] = selector;
-                       this.length++;
+                       this.length = 1;
                        return this;
                }
 
@@ -100,7 +96,7 @@ jQuery.fn = jQuery.prototype = {
                                                }
 
                                                // Otherwise, we inject the element directly into the jQuery object
-                                               this.length++;
+                                               this.length = 1;
                                                this[0] = elem;
                                        }
 
@@ -227,7 +223,7 @@ jQuery.fn = jQuery.prototype = {
        },
 
        is: function( selector ) {
-               return !!selector && jQuery.multiFilter( selector, this ).length > 0;
+               return !!selector && jQuery.filter( selector, this ).length > 0;
        },
 
        // For internal use only.
@@ -284,7 +280,7 @@ jQuery.extend = jQuery.fn.extend = function() {
                                                clone = src;
                                        } else if ( jQuery.isArray(copy) ) {
                                                clone = [];
-                                       } else if ( jQuery.isObject(copy) ) {
+                                       } else if ( jQuery.isObjectLiteral(copy) ) {
                                                clone = {};
                                        } else {
                                                clone = copy;
@@ -327,8 +323,25 @@ jQuery.extend({
                return toString.call(obj) === "[object Array]";
        },
 
-       isObject: function( obj ) {
-               return this.constructor.call(obj) === Object;
+       isObjectLiteral: function( obj ) {
+               if ( toString.call(obj) !== "[object Object]" ) {
+                       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 === undefined || hasOwnProperty.call( obj, key );
        },
 
        isEmptyObject: function( obj ) {
@@ -435,6 +448,10 @@ jQuery.extend({
        },
 
        inArray: function( elem, array ) {
+               if ( array.indexOf ) {
+                       return array.indexOf( elem );
+               }
+
                for ( var i = 0, length = array.length; i < length; i++ ) {
                        if ( array[ i ] === elem ) {
                                return i;
@@ -449,43 +466,13 @@ jQuery.extend({
                // expando of getElementsByTagName
                var i = 0, elem, pos = first.length;
 
-               // Also, we need to make sure that the correct elements are being returned
-               // (IE returns comment nodes in a '*' query)
-               if ( !jQuery.support.getAll ) {
-                       while ( (elem = second[ i++ ]) != null ) {
-                               if ( elem.nodeType !== 8 ) {
-                                       first[ pos++ ] = elem;
-                               }
-                       }
-
-               } else {
-                       while ( (elem = second[ i++ ]) != null ) {
-                               first[ pos++ ] = elem;
-                       }
+               while ( (elem = second[ i++ ]) != null ) {
+                       first[ pos++ ] = elem;
                }
 
                return first;
        },
 
-       unique: function( array ) {
-               var ret = [], done = {}, id;
-
-               try {
-                       for ( var i = 0, length = array.length; i < length; i++ ) {
-                               id = jQuery.data( array[ i ] );
-
-                               if ( !done[ id ] ) {
-                                       done[ id ] = true;
-                                       ret.push( array[ i ] );
-                               }
-                       }
-               } catch( e ) {
-                       ret = array;
-               }
-
-               return ret;
-       },
-
        grep: function( elems, callback, inv ) {
                var ret = [];
 
@@ -553,9 +540,12 @@ function evalScript( i, elem ) {
        }
 }
 
+// Mutifunctional method to get and set values to a collection
+// The value/s can be optionally by executed if its a function
 function access( elems, key, value, exec, fn ) {
        var l = elems.length;
        
+       // Setting many attributes
        if ( typeof key === "object" ) {
                        for (var k in key) {
                                access(elems, k, key[k], exec, fn);
@@ -563,7 +553,9 @@ function access( elems, key, value, exec, fn ) {
                return elems;
        }
        
+       // Setting one attribute
        if (value !== undefined) {
+               // Optionally, function values get executed if exec is true
                exec = exec && jQuery.isFunction(value);
                
                for (var i = 0; i < l; i++) {
@@ -574,6 +566,7 @@ function access( elems, key, value, exec, fn ) {
                return elems;
        }
        
+       // Getting an attribute
        return l ? fn(elems[0], key) : null;
 }