From: Rick Waldron Date: Thu, 5 Mar 2015 19:56:54 +0000 (-0500) Subject: Data: updates to element[expando] cache X-Git-Tag: 3.0.0-alpha1~106 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=222ac3ad6bd40ef4dfb4e4c60bac4b751d907e2a;p=jquery.git Data: updates to element[expando] cache - removes descriptor allocation - restore simplified cache creation - adds early return from remove call where no data exists - use Object.defineProperty - remove unnecessary code path Closes gh-2119 --- diff --git a/src/data/Data.js b/src/data/Data.js index ec108e062..458473430 100644 --- a/src/data/Data.js +++ b/src/data/Data.js @@ -14,34 +14,23 @@ Data.accepts = jQuery.acceptData; Data.prototype = { register: function( owner, initial ) { - var descriptor = {}, - value = initial || {}; - - try { - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable, non-writable property - // configurability must be true to allow the property to be - // deleted with the delete operator - } else { - descriptor[ this.expando ] = { - value: value, - writable: true, - configurable: true - }; - Object.defineProperties( owner, descriptor ); - } + var value = initial || {}; - // Support: Android < 4 - // Fallback to a less secure definition - } catch ( e ) { - descriptor[ this.expando ] = value; - jQuery.extend( owner, descriptor ); - } + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + // Otherwise secure it in a non-enumerable, non-writable property + // configurability must be true to allow the property to be + // deleted with the delete operator + } else { + Object.defineProperty( owner, this.expando, { + value: value, + writable: true, + configurable: true + }); + } return owner[ this.expando ]; }, cache: function( owner, initial ) { @@ -73,15 +62,9 @@ Data.prototype = { // Handle: [ owner, { properties } ] args } else { - // Fresh assignments by object are shallow copied - if ( jQuery.isEmptyObject( cache ) ) { - - jQuery.extend( cache, data ); - // Otherwise, copy the properties one-by-one to the cache object - } else { - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ prop ] = data[ prop ]; } } return cache; @@ -128,7 +111,11 @@ Data.prototype = { }, remove: function( owner, key ) { var i, name, camel, - cache = this.cache( owner ); + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } if ( key === undefined ) { this.register( owner );