按值而非按引用复制新对象中的对象函数和属性 - javascript

时间:2017-12-29 13:41:43

标签: javascript jquery

我想将对象的功能和属性复制到新对象中。旧对象不应通过更改新对象中的效果来生效。

这是对象定义:

  var Call = function() {
        this.number="123";
    }
    Call.prototype.function1 = function() {
         return this.number;
    }
    var callobj = new Call();

我可以使用callobj.function1()访问function1。

我试图复制它:

使用Javascript:

var newcallobj = Object.assign({}, callobj);

在这种情况下,我无法访问function1,但我可以直接访问号码属性。

JQUERY:

var newObj = jQuery.extend(true, {}, callobj); OR 
var newObj = jQuery.extend({}, callobj);

在这种情况下,我可以访问function1和property但是当我更改newObj.number="222"之类的数字时。它还会更改原始对象的值。

我知道还有其他几个帖子。但一切都不适合我。如果我做错了什么,请告诉我?

AFTER @ gurvinder372回答(我正在更新问题): @ gurvinder372之后回答。它适用于第一级属性,但如果它有另一个对象,如我在下面显示,我更改另一个对象的属性值。然后它也影响原始对象。

var ABC = function(){
    this.number = "333";
}
var Call = function() {
    this.number="123";
    this.anotherobj = new ABC();
}
Call.prototype.function1 = function() {
     return this.number;
}
var callobj = new Call();
var newcallobj = Object.create(callobj);
newcallobj.anotherobj.number= "123";
console.log(newcallobj.anotherobj.number);
console.log(callobj.anotherobj.number);

两者的输出均为123. @ gurvinder372。你可以查看上面的代码吗?

2 个答案:

答案 0 :(得分:2)

Object.assign仅复制对象的可枚举属性。

使用Object.create代替Object.assign

var newcallobj = Object.create(callobj);



var Call = function() {
    this.number="123";
}
Call.prototype.function1 = function() {
     return this.number;
}
var callobj = new Call();
var newcallobj = Object.create(callobj);
console.log(newcallobj.function1());




答案 1 :(得分:0)

确定。在@ gurvinder372的帮助下。以下解决方案对我有用。

var ABC = function(){
    this.number = "333";
}
var Call = function() {
    this.number="123";
    this.anotherobj = new ABC();
}
Call.prototype.function1 = function() {
     return this.number;
}
var callobj = new Call();
var newcallobj = Object.create(callobj);
newcallobj.anotherobj = Object.create(callobj.anotherobj);
newcallobj.anotherobj.number= "123";
console.log(newcallobj.anotherobj.number);
console.log(callobj.anotherobj.number);

如果有更好的解决方案,请告诉我吗?