Skip to content

Commit

Permalink
Data: Make the data object a regular object again
Browse files Browse the repository at this point in the history
The change in jquerygh-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 jquerygh-4665
Ref jquerygh-4603
  • Loading branch information
mgol committed Apr 13, 2020
1 parent 898784a commit 2ee54e9
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 10 deletions.
2 changes: 1 addition & 1 deletion src/data/Data.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
21 changes: 12 additions & 9 deletions test/unit/data.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() );
} );

0 comments on commit 2ee54e9

Please sign in to comment.