2014-12-03 157 views
-1

我疯了吗?JS克隆对象并删除元素

我想克隆一个对象然后从它删除一个元素,但它也从最初的对象中删除。我觉得我不再理解生活!

var obj1 = { 
    'name' : 'bob', 
    'hair' : 'brown' 
} 

var obj2 = obj1; 
delete obj2.hair; 

This delete's obj1.hair。怎么样?什么?为什么?

+1

那不是 “克隆” – Kyslik 2014-12-03 02:22:41

回答

0

var obj2 = obj1;不克隆该对象。它只是使第二个变量指向完全相同的对象。在Javascript中,对象通过引用进行分配(而不是通过复制)。所以,这两个变量都指向唯一的对象。

如果你真的想要一个克隆,那么你必须实际做一个克隆。这不是JavaScript语言内置的功能,但您可以构建一个克隆功能。那里有很多。

一些参考:

What is the most efficient way to deep clone an object in JavaScript?

How do I correctly clone a JavaScript object?

What is the most efficient way to deep clone an object in JavaScript?

How to Deep clone in javascript

+1

添加到各种克隆函数的引用。 – jfriend00 2014-12-03 02:26:10

0

obj2obj1指向同一个对象。您需要clone it或new了解具有相似值的对象的两个不同引用。

function Obj(name, hairColor){ 
    this.name = name; 
    this.hair = hairColor; 
}; 

var obj1 = new Obj('bob', 'brown'); 
var obj2 = new Obj('bob', 'brown'); 

delete obj2.hair; 

Another alternative,如果限定如上述描绘的Obj功能,是不可行的,是编写遍历一个对象的属性,并返回具有相同的值的新对象的函数。

+0

哦.. geeze。好的。我怎样才能快速做到这一点,以便我可以使用“新”? – user3822370 2014-12-03 02:24:13

+0

搜索...多数民众赞成如何https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new – Kyslik 2014-12-03 02:24:57

0
function clone(obj) { 
    if(obj == null || typeof(obj) != 'object') 
     return obj; 

    var temp = obj.constructor(); // changed 

    for(var key in obj) { 
     if(obj.hasOwnProperty(key)) { 
      temp[key] = clone(obj[key]); 
     } 
    } 
    return temp; 
} 

使用

var obj1 = { 
    'name' : 'bob', 
    'hair' : 'brown' 
} 

var obj2 = clone(obj1); 

一切归功于这里https://stackoverflow.com/a/122190/1564365

(我觉得这么愚蠢回答这个问题。)