clones

should deep clone everything even global objects, functions, circularities, ...

  • clones

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
clones
201.2.04 years ago6 years agoMinified + gzip package size for clones in KB

Readme

clones
NPM version
should deep clone everything even global objects, functions, circularities, ...

Companion for safer-eval.
Runs on node and in modern browsers:
| | Versions | | --- | --- | | node | 0.12, 4, 6, 8, 10, 11 | | Chrome | 55, 56, 71 | | Firefox | 45, 51, 64 | | Edge | 14, 16 | | IE | 11 | | Safari | 10 | | iOS Safari | 10 |

Installation

npm i -S clones

Usage

const clones = require('clones')
const dest = clones(source, [bind])

Parameters
Parameters
source: Object, clone source
bind: Object, bind functions to this context
Returns: Any, deep clone of source
Example:
const clones = require('clones')

var source = {
  obj: {a: {b: 1}},
  arr: [true, 1, {c: 'dee'}],
  fn: function () { return this.number + 12 }
}
// adding circularity
source.obj.a.e = source.obj.a

// do the cloning (with binding a context)
var dest = clones(source, {number: 30})
// => { obj: { a: { b: 1, e: [Circular] }, d: 2017-02-17T21:57:44.576Z },
//      arr: [ true, 1, { c: 'dee' } ],
//      fn: [Function: fn] }

// checks
assert.ok(dest !== source)                      // has different reference
assert.ok(dest.obj !== source.obj)              // has different reference
assert.ok(dest.obj.a !== source.obj.a)          // has different reference
assert.ok(dest.obj.a.e !== source.obj.a.e)      // different references for circularities
assert.equal(dest.obj.d.toISOString(),
  source.obj.d.toISOString())                   // has same content
assert.ok(dest.fn !== source.fn)                // has different function reference
source.fn = source.fn.bind({number: 29})        // bind `this` for `source`
assert.equal(dest.fn(), source.fn() + 1)        // returning the same result

Clone prototypes or classes

const clones = require('clones')
// clone built in `Array`
const C = clones.classes(Array)

let c = new C(1,2,3)
// => [1, 2, 3]
c.reverse()
// => [3, 2, 1]

License

MIT