2017-07-25 63 views
0

我想克隆原始对象和函数而不用引用,我的代码是否考虑克隆对象和函数的正确方法?具有功能的克隆对象

var apple = new function() { 
    this.type = "macintosh"; 
    this.color = "red"; 
} 


function aaa() { 
     return this.color + ' ' + this.type + ' apple'; 
    }; 

var a = JSON.parse(JSON.stringify(apple)) 
var b = 
JSON.parse(JSON.stringify(apple)); 

console.log(a) 


a.getInfo = aaa 

b.getInfo = aaa 

a.color='green' // only a is green color 

console.log(a.getInfo()) 

console.log(b.getInfo()) 
+0

在的“克隆”你的对象甚至没有包含的功能 – Bergi

+0

是的,我所示的例子功能是不是在对象但每一个问题我的时间发现似乎没有提到如何克隆对象中存在的函数,并通过JSON解析抛弃。 –

+0

那么你现在还是不在乎功能呢?然后适当调整你的例子。 – Bergi

回答

0

试试这个功能:

var clone = function (object) { 
    // Copy everything that is not an object 
    if (object == null || typeof(object) !== 'object') { 
    return object 
    } 
    // Calling constructor 
    var temp = new object.constructor() 

    // Recursively cloning children 
    for (var key in object) { 
    temp[key] = clone(object[key]) 
    } 

    return temp 
} 

测试:

var test = { a: 0, b: function() { console.log(1) } } 
var cloned = clone(test) 

https://jsfiddle.net/feshcdLe/1/

+0

只有a被复制b功能不被复制? –

+0

@JamesLei你尝试过吗? – euvl

+0

我试过了,b没有复制,只有一个?你可以有一个JSFiddle,因为我在手机上。 –

0

对于克隆的对象,你可以使用Object.assign并设置第一个参数为空对象。 例如

const clone = Object.assign({}, apple.call({})); 
const result = aaa.call(clone); 
console.log(result); 
//=> red macintosh apple; 

我利用了Function.call这里只是因为我不知道,如果你打算访问全局this或不同的范围或内容。如果你知道你的this指的是,那么你可以简单地做。

const clone = Object.assign({}, this); 
const result = aaa(); 
console.log(result); 

MDN Object.assign

MDN Function.call

+0

这不是MDN所说的。它复制原始对象的值。它也运行getters。它仅引用原始对象是否包含引用。 – Nick

+1

真正的修正,它对简单的对象很有用,我试图将函数添加到原始对象中并进行赋值,但它没有按照我的喜好将函数克隆到新对象。 –

+0

啊我明白了。那时我误解了这个问题。也许这个由相同分配文档提供的解决方案可以满足您的需求吗?看看'completeAssign'函数。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Copying_accessors – Nick