<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">Le 24 sept. 2015 à 19:58, Andrea Giammarchi <<a href="mailto:andrea.giammarchi@gmail.com" class="">andrea.giammarchi@gmail.com</a>> a écrit :</div><div class=""><div dir="ltr" class=""><div class=""><span style="font-size:12.8px" class=""><br class=""></span></div><div class="">Last, but not least, one does not simply assign properties in JavaScript. If you want to clone you don't want to miss possible get/set accessors in the process, you don't want to miss getOwnPropertyNames and getOwnpropertySymbols neither, so the last loop doesn't work as proposal.</div><div class=""><br class=""></div><div class="">```js</div><div class="">// simplified version for regular objects only</div><div class="">// basically just the correct substitute of your last temp logic</div><div class=""><div class="">Object.clone = function (src) {</div><div class="">  return Object.setPrototypeOf(</div><div class="">    Reflect.ownKeys(src).reduce((o, k) => {</div><div class="">      var d = Object.getOwnPropertyDescriptor(src, k);</div><div class="">      if (</div><div class="">        o.hasOwnProperty.call(d, 'value') &&</div><div class="">        /function|object/.test(typeof d.value)</div><div class="">      ) d.value = Object.clone(d.value);</div><div class="">      return Object.defineProperty(o, k, d);</div><div class="">    }, {}),</div><div class="">    Object.getPrototypeOf(src)</div><div class="">  );</div><div class="">};</div></div><div class="">```</div></div></div></blockquote><div><br class=""></div><div>```js</div><div>Object.clone = function (src) {</div><div>    return Object.create(Object.getPrototypeOf(src), Object.getOwnPropertyDescriptors(src))</div><div>}</div><div>```</div><div><br class=""></div><div>where  the definition of `Object.getOwnPropertyDescriptors()` is left as an exercise to the reader.</div><div><br class=""></div><div><br class=""></div><div>—Claude</div><div><br class=""></div></div></body></html>