2017-07-25 116 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