zoukankan      html  css  js  c++  java
  • Javascript中的一种深复制实现

    在javascript中,所有的object变量之间的赋值都是传地址的,可能有同学会问哪些是object对象。举例子来说明可能会比较好:

    typeof(true)    //"boolean"
    typeof(1)       //"number"
    typeof("1")     //"string"
    typeof({})      //"object"
    typeof([])      //"object"
    typeof(null)    //"object"
    typeof(function(){})  //"function"
    

    所以其实我们深复制主要需要处理的对象就是object对象,非object对象只要直接正常的赋值就好。我实现js深复制的思路就是:

    • 遍历所有该对象的属性,
    • 如果该属性是"object"则需要特殊处理,
      • 如果这个object对象比较特殊,是一个数组,那就创建一个新的数组并深复制数组里的元素
      • 如果这个object对象是个非数组对象,那直接再对它递归调用深复制方法即可。
    • 如果不是"object",则直接正常复制就行。

    下面就是我的实现了:

    Object.prototype.DeepCopy = function () {
      var obj, i;
      obj = {};
    
      for (attr in this) {
        if (this.hasOwnProperty(attr)) {
          if (typeof(this[attr]) === "object") {
            if (this[attr] === null) {
              obj[attr] = null;
            }
            else if (Object.prototype.toString.call(this[attr]) === '[object Array]') {
              obj[attr] = [];
              for (i=0; i<this[attr].length; i++) {
                obj[attr].push(this[attr][i].DeepCopy());
              }
            } else {
              obj[attr] = this[attr].DeepCopy();
            }
          } else {
            obj[attr] = this[attr];
          }
        }
      }
      return obj;
    };
    

    如果浏览器支持ECMAScript 5的话,为了深复制对象属性的所有特性,可以使用

    Object.defineProperty(obj, attr, Object.getOwnPropertyDescriptor(this, attr));
    

    来替代

    obj[attr] = this[attr];
    


    直接在Object.prototype上实现该方法的好处是,所有对象都会继承该方法。坏处是某些库也会改写Object对象,所以有时会发生冲突。这是需要注意的。具体使用方法如下:

    Object.prototype.DeepCopy = function () { ... }
    var a = { x:1 };
    var b = a;
    var c = a.DeepCopy();
    a.x = 2;
    b.x = 3;
    console.log(a.x);   //3
    console.log(b.x);   //3
    console.log(c.x);   //1
    

    转载请注明出处:jerryzou.com

    钟爱javascript的程序猿
  • 相关阅读:
    微服务架构技术栈选型手册(万字长文)
    Visual Studio 2013 always switches source control plugin to Git and disconnect TFS
    Visual Studio 2013 always switches source control plugin to Git and disconnect TFS
    MFC对话框中使用CHtmlEditCtrl
    ATL开发 ActiveX控件的 inf文件模板
    ActiveX: 如何用.inf和.ocx文件生成cab文件
    Xslt 1.0中使用Array
    如何分隔两个base64字符串?
    An attempt was made to load a program with an incorrect format
    JQuery 公网 CDN
  • 原文地址:https://www.cnblogs.com/jerryzou/p/3572693.html
Copyright © 2011-2022 走看看