js原生clone函数(ES5)

JS拷贝函数(ES5)

直接上代码了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
   * 对象拷贝处理
   * @param obj 要拷贝的对象
   * @returns 拷贝后的对象
   */
  function clone(obj) {
    // js 基本类型
    var jsTypeList = [Boolean, Number, String, Date, RegExp];
    // 构造函数列表
    var constructorList = {}
    // this对象保存
    var self = this;
    // 向构造函数列表中添加对应函数
    for (var i = 0; i < jsTypeList.length; i++) {
      constructorList[jsTypeList[i]] = function(obj) {
        // 基本类型拷贝
        return new jsTypeList[i](obj)
      }
    }
    // 对象类型拷贝处理
    constructorList[Object] = function(obj) {
      var clonedObject = new (obj.constructor);
      for (var attr in obj) {
        clonedObject[attr] = typeof obj[attr] == "object" ? constructorList[Object](obj[attr]) : obj[attr];
      }
      return clonedObject;
    }
    // 数组类型拷贝处理
    constructorList[Array] = function (obj) {
      var clonedArray = [];
      for (var i = 0; i < obj.length; i++) {
        clonedArray[i] = typeof obj[i] == "object" ? constructorList[Object](obj[i]): obj[i];
      }
      return clonedArray;
    }
    // 向构造函数列表中添加对象,数组
    jsTypeList.push(Object, Array);
    // 克隆处理
    for (var i = 0; i < jsTypeList.length; i++) {
      if (obj instanceof jsTypeList[i]) {
        return constructorList[jsTypeList[i]](obj);
      }
    }
    return obj;
  }
  // 测试对象
  var person = {
                  name: "tom",
                  age: 32,
                  detailInfo: {hobby: ["music", "movie", "badminton"]}
                }
  console(clone(person));
  console(clone(person) == person);
  console(clone(person).detailInfo == person.detailInfo);