Advertisement
Guest User

Untitled

a guest
Jul 17th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.  
  3.  
  4.  
  5. function deepCopy(obj, seen=new Map()) {
  6.     let type = typeof obj
  7.     if(type === 'object') {
  8.         let result = Object.create(Object.getPrototypeOf(obj))
  9.         let descriptors = Object.getOwnPropertyDescriptors(obj)
  10.         for(name in descriptors) {
  11.             let descriptor = descriptors[name]
  12.             if(descriptor.get || descriptor.set) {
  13.                 Object.defineProperty(result, name, {
  14.                     configurable: descriptor.configurable,
  15.                     enumerable: descriptor.enumerable,
  16.                     set: descriptor.set,
  17.                     get: descriptor.get,
  18.                 })
  19.             } else if(descriptor.value) {
  20.                 let value
  21.                 if(seen.has(descriptor.value)) {
  22.                     value = seen.get(descriptor.value)
  23.                 } else {
  24.                     value = deepCopy(descriptor.value, seen)
  25.                     seen.set(descriptor.value, value)
  26.                 }
  27.                 Object.defineProperty(result, name, {
  28.                     configurable: descriptor.configurable,
  29.                     enumerable: descriptor.enumerable,
  30.                     value: value,
  31.                     writable: descriptor.writable,
  32.                 })
  33.             }
  34.         }
  35.         return result
  36.     } else if(type === 'function') {
  37.         let result = obj.bind(null)
  38.         let descriptors = Object.getOwnPropertyDescriptors(obj)
  39.         for(let name in ['length', 'name', 'arguments', 'caller']) {
  40.             delete descriptors[name]
  41.         }
  42.         for(name in descriptors) {
  43.             let descriptor = descriptors[name]
  44.             if(descriptor.get || descriptor.set) {
  45.                 Object.defineProperty(result, name, {
  46.                     configurable: descriptor.configurable,
  47.                     enumerable: descriptor.enumerable,
  48.                     set: descriptor.set,
  49.                     get: descriptor.get,
  50.                 })
  51.             } else if(descriptor.value) {
  52.                 let value
  53.                 if(seen.has(descriptor.value)) {
  54.                     value = seen.get(descriptor.value)
  55.                 } else {
  56.                     value = deepCopy(descriptor.value, seen)
  57.                     seen.set(descriptor.value, value)
  58.                 }
  59.                 Object.defineProperty(result, name, {
  60.                     configurable: descriptor.configurable,
  61.                     enumerable: descriptor.enumerable,
  62.                     value: value,
  63.                     writable: descriptor.writable,
  64.                 })
  65.             }
  66.         }
  67.         return result
  68.     } else {
  69.         return obj
  70.     }
  71. }
  72.  
  73. a = deepCopy({1: {2: [3,4,5,6]}})
  74.  
  75. a = deepCopy([1, 2, 3])
  76.  
  77. kek = function() {}
  78. kek.lol = 123
  79. a = deepCopy(kek)
  80.  
  81. function kek() {
  82.     this.lol = 123
  83. }
  84. kek.prototype.lel = function() {
  85.     this.lol += 1
  86.     return this.lol
  87. }
  88. a = deepCopy(new kek())
  89. a.lel()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement