]> source.dussan.org Git - jquery.git/commitdiff
Data: Make the data object a regular object again
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Mon, 20 Apr 2020 16:11:18 +0000 (18:11 +0200)
committerGitHub <noreply@github.com>
Mon, 20 Apr 2020 16:11:18 +0000 (18:11 +0200)
The change in gh-4603 made the object returned by `elem.data()`
a prototype-less object. That's a desired change to support keys
colliding with `Object.prototype` properties but it's also a breaking
change so it has to wait for jQuery 4.0.0.

A 3.x-only test was added to avoid breaking it in the future on this
branch.

Fixes gh-4665
Ref gh-4603
Closes gh-4666

src/data/Data.js
test/unit/data.js

index ce6d8fa9bab48c7e3bdf5a47cf614f2ff08272fa..31ff4318c1770ec43655e17d02a4373675e5c4bd 100644 (file)
@@ -22,7 +22,7 @@ Data.prototype = {
 
                // If not, create one
                if ( !value ) {
-                       value = Object.create( null );
+                       value = {};
 
                        // We can accept data for non-element nodes in modern browsers,
                        // but we should not, see #8335.
index 55879415fa29e0e4191708b7741c36b80d99d7fa..3a2047cff5ea4846390d3868ed040e95da6d3192 100644 (file)
@@ -990,17 +990,20 @@ QUnit.test( ".data(prop) does not create expando", function( assert ) {
        }
 } );
 
-QUnit.test( "keys matching Object.prototype properties  (gh-3256)", function( assert ) {
-       assert.expect( 2 );
+QUnit.test( ".data() returns a regular object (jQuery <4 only, gh-4665)", function( assert ) {
+       assert.expect( 4 );
 
-       var div = jQuery( "<div></div>" );
+       function verifyRegularObject( assert, object ) {
+               assert.strictEqual( object.hasOwnProperty, Object.prototype.hasOwnProperty,
+                       "Data object has the hasOwnProperty method" );
+               assert.strictEqual( object + "", "[object Object]",
+                       "Data object can be stringified" );
+       }
 
-       assert.strictEqual( div.data( "hasOwnProperty" ), undefined,
-               "hasOwnProperty not matched (before forced data creation)" );
+       var elem = jQuery( "<div></div>" );
 
-       // Force the creation of a data object for this element.
-       div.data( { foo: "bar" } );
+       verifyRegularObject( assert, elem.data() );
 
-       assert.strictEqual( div.data( "hasOwnProperty" ), undefined,
-               "hasOwnProperty not matched (after forced data creation)" );
+       elem.data( "foo", "bar" );
+       verifyRegularObject( assert, elem.data() );
 } );