clones
v1.2.0
Published
should deep clone everything even global objects, functions, circularities, ...
Downloads
36,115
Maintainers
Readme
clones
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]