Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function deepCopy(obj, seen=new Map()) {
- let type = typeof obj
- if(type === 'object') {
- let result = Object.create(Object.getPrototypeOf(obj))
- let descriptors = Object.getOwnPropertyDescriptors(obj)
- for(name in descriptors) {
- let descriptor = descriptors[name]
- if(descriptor.get || descriptor.set) {
- Object.defineProperty(result, name, {
- configurable: descriptor.configurable,
- enumerable: descriptor.enumerable,
- set: descriptor.set,
- get: descriptor.get,
- })
- } else if(descriptor.value) {
- let value
- if(seen.has(descriptor.value)) {
- value = seen.get(descriptor.value)
- } else {
- value = deepCopy(descriptor.value, seen)
- seen.set(descriptor.value, value)
- }
- Object.defineProperty(result, name, {
- configurable: descriptor.configurable,
- enumerable: descriptor.enumerable,
- value: value,
- writable: descriptor.writable,
- })
- }
- }
- return result
- } else if(type === 'function') {
- let result = obj.bind(null)
- let descriptors = Object.getOwnPropertyDescriptors(obj)
- for(let name in ['length', 'name', 'arguments', 'caller']) {
- delete descriptors[name]
- }
- for(name in descriptors) {
- let descriptor = descriptors[name]
- if(descriptor.get || descriptor.set) {
- Object.defineProperty(result, name, {
- configurable: descriptor.configurable,
- enumerable: descriptor.enumerable,
- set: descriptor.set,
- get: descriptor.get,
- })
- } else if(descriptor.value) {
- let value
- if(seen.has(descriptor.value)) {
- value = seen.get(descriptor.value)
- } else {
- value = deepCopy(descriptor.value, seen)
- seen.set(descriptor.value, value)
- }
- Object.defineProperty(result, name, {
- configurable: descriptor.configurable,
- enumerable: descriptor.enumerable,
- value: value,
- writable: descriptor.writable,
- })
- }
- }
- return result
- } else {
- return obj
- }
- }
- a = deepCopy({1: {2: [3,4,5,6]}})
- a = deepCopy([1, 2, 3])
- kek = function() {}
- kek.lol = 123
- a = deepCopy(kek)
- function kek() {
- this.lol = 123
- }
- kek.prototype.lel = function() {
- this.lol += 1
- return this.lol
- }
- a = deepCopy(new kek())
- a.lel()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement