clone.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. var objectToString = require('./staticObjectToString')
  2. var objectEach = require('./objectEach')
  3. var arrayEach = require('./arrayEach')
  4. function getCativeCtor (val, args) {
  5. var Ctor = val.__proto__.constructor
  6. return args ? new Ctor(args) : new Ctor()
  7. }
  8. function handleValueClone (item, isDeep) {
  9. return isDeep ? copyValue(item, isDeep) : item
  10. }
  11. function copyValue (val, isDeep) {
  12. if (val) {
  13. switch(objectToString.call(val)) {
  14. case "[object Object]": {
  15. var restObj = Object.create(Object.getPrototypeOf(val))
  16. objectEach(val, function (item, key) {
  17. restObj[key] = handleValueClone(item, isDeep)
  18. })
  19. return restObj
  20. }
  21. case "[object Date]":
  22. case "[object RegExp]": {
  23. return getCativeCtor(val, val.valueOf())
  24. }
  25. case "[object Array]":
  26. case "[object Arguments]": {
  27. var restArr = []
  28. arrayEach(val, function (item) {
  29. restArr.push(handleValueClone(item, isDeep))
  30. })
  31. return restArr
  32. }
  33. case "[object Set]": {
  34. var restSet = getCativeCtor(val)
  35. restSet.forEach(function (item) {
  36. restSet.add(handleValueClone(item, isDeep))
  37. })
  38. return restSet
  39. }
  40. case "[object Map]": {
  41. var restMap = getCativeCtor(val)
  42. restMap.forEach(function (item, key) {
  43. restMap.set(key, handleValueClone(item, isDeep))
  44. })
  45. return restMap
  46. }
  47. }
  48. }
  49. return val
  50. }
  51. /**
  52. * 浅拷贝/深拷贝
  53. *
  54. * @param {Object} obj 对象/数组
  55. * @param {Boolean} deep 是否深拷贝
  56. * @return {Object}
  57. */
  58. function clone (obj, deep) {
  59. if (obj) {
  60. return copyValue(obj, deep)
  61. }
  62. return obj
  63. }
  64. module.exports = clone