Skip to content

Commit 6f02157

Browse files
committedNov 24, 2018
Fix clone() for redefined properties. Closes #278
1 parent 73c35e8 commit 6f02157

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed
 

‎lib/index.js

+17-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ exports.clone = function (obj, seen) {
3333

3434
let newObj;
3535
let cloneDeep = false;
36+
const isArray = Array.isArray(obj);
3637

37-
if (!Array.isArray(obj)) {
38+
if (!isArray) {
3839
if (Buffer.isBuffer(obj)) {
3940
newObj = Buffer.from(obj);
4041
}
@@ -68,6 +69,11 @@ exports.clone = function (obj, seen) {
6869
const keys = Object.getOwnPropertyNames(obj);
6970
for (let i = 0; i < keys.length; ++i) {
7071
const key = keys[i];
72+
73+
if (isArray && key === 'length') {
74+
continue;
75+
}
76+
7177
const descriptor = Object.getOwnPropertyDescriptor(obj, key);
7278
if (descriptor &&
7379
(descriptor.get ||
@@ -76,9 +82,18 @@ exports.clone = function (obj, seen) {
7682
Object.defineProperty(newObj, key, descriptor);
7783
}
7884
else {
79-
newObj[key] = exports.clone(obj[key], seen);
85+
Object.defineProperty(newObj, key, {
86+
enumerable: descriptor ? descriptor.enumerable : true,
87+
writable: true,
88+
configurable: true,
89+
value: exports.clone(obj[key], seen)
90+
});
8091
}
8192
}
93+
94+
if (isArray) {
95+
newObj.length = obj.length;
96+
}
8297
}
8398

8499
return newObj;

‎test/index.js

+21-1
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,26 @@ describe('clone()', () => {
371371
Object.getOwnPropertyDescriptor = oldGetOwnPropertyDescriptor;
372372
expect(copy).to.equal(obj);
373373
});
374+
375+
it('clones own property when class property is not writable', () => {
376+
377+
const Cl = class {
378+
379+
get x() {
380+
381+
return 'hi';
382+
}
383+
};
384+
385+
const obj = new Cl();
386+
387+
Object.defineProperty(obj, 'x', {
388+
value: 0, writable: true
389+
});
390+
391+
const copy = Hoek.clone(obj);
392+
expect(copy).to.equal(obj);
393+
});
374394
});
375395

376396
describe('merge()', () => {
@@ -436,7 +456,7 @@ describe('merge()', () => {
436456
it('merges from null prototype objects', () => {
437457

438458
const a = {};
439-
459+
440460
const b = Object.create(null);
441461
b.x = true;
442462

0 commit comments

Comments
 (0)
Please sign in to comment.