Skip to content

Commit

Permalink
Improve Object.assign
Browse files Browse the repository at this point in the history
- Use Object.keys (now fixed!) to obtain list of enumerable own keys,
  and iterate over that rather than using a for-in loop.  This avoids
  having to check whether the keys are own keys or not.

- Make Object.assign non-enumerable.

- Add tests.
  • Loading branch information
cpcallen committed Mar 9, 2022
1 parent 70c7db2 commit dc49794
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 10 deletions.
21 changes: 11 additions & 10 deletions server/startup/es6.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,24 +91,25 @@ var WeakMap = new 'WeakMap';
///////////////////////////////////////////////////////////////////////////////

Object.assign = function assign(target, varArgs) {
// Polyfill adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#polyfill
// The length property of the assign method is 2.
if (target === null || target === undefined) {
throw new TypeError('Cannot convert undefined or null to object');
}
for (var index = 1; index < arguments.length; index++) {
var nextSource = arguments[index];
if (nextSource !== null && nextSource !== undefined) {
for (var nextKey in nextSource) {
// Avoid bugs when hasOwnProperty is shadowed
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
target = Object(target);

for (var i = 1; i < arguments.length; i++) {
var src = arguments[i];
if (src !== null && src !== undefined) {
var keys = Object.keys(src);
for (var j = 0; j < keys.length; j++) {
var key = keys[j];
target[key] = src[key];
}
}
}
return to;
return target;
};
Object.defineProperty(Array, 'assign', {enumerable: false});


///////////////////////////////////////////////////////////////////////////////
Expand Down
20 changes: 20 additions & 0 deletions server/tests/testcases.js
Original file line number Diff line number Diff line change
Expand Up @@ -1476,6 +1476,26 @@ module.exports = [
`,
expected: 82,
},
{
name: 'Object.assign',
src: `
var p = {x: 'inherited enumerable', y: 'inherited nonenumerable'};
var o = Object.create(p);
o.a = 'own enumerable';
o.b = 'own nonenumerable';
o.c = 'own enumerable';
Object.defineProperty(p, 'y', {enumerable: false});
Object.defineProperty(o, 'b', {enumerable: false});
var t = {a: 'to be overwritten', b: 'not overwritten', d: 'preserved'};
Object.assign(t, o, {e: 'extra'});
[Object.getOwnPropertyNames(t).length,
t.a, t.b, t.c, t.d, t.e].toString();
`,
expected:
'5,own enumerable,not overwritten,own enumerable,preserved,extra',
},
{
name: 'Object.getOwnPropertyNames',
src: `
Expand Down

0 comments on commit dc49794

Please sign in to comment.