2014-01-20 34 views
0

jQuery讓我的生活更輕鬆,但我仍然是JavaScript的初學者。因此,可,我問一個非常愚蠢的問題在這裏:如何定義變量類型的數組對象的新對象?

var t = { 
    rows: 3, 
    columns: 5, 
    getCellCount: function() { 
     return this.rows * this.columns; 
    } 
}; 
var tn = t; 
tn.rows = 6; 
document.write(tn.rows + " , " + t.rows); // returns 6 , 6 

我也試過var tn = new t(); // but seems wrong

因此,如何檢索對象的老內在價值,使其結果6,3

+0

'var tn = t;'不克隆對象本身,它只是複製對該對象的引用。 「[克隆對象的最有效方法是?](http://stackoverflow.com/questions/122102/most-efficient-way-to-clone-an-object)」可能有助於其他。 –

+0

那麼,我該如何克隆,結果可能是6,3 –

+1

查看上述問題。但是,一個選項是['var tn = Object.create(t);'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create) t''從't'繼承而不是相同。 –

回答

5

tnt都指向相同的對象,這就是爲什麼當你改變tn.rows它也改變t.rows。有沒有這樣的事情old intrinsic value

您必須複製對象才能保留舊值。有兩個:shallow copy and deep copy

使用Object.create複製鍵值對非常容易。現在

var newObj = Object.create(oldObj); 

如果更改newObj值,也不會改變原有的一個:

var a = {a:1}, b = Object.create(a); 
b.a = 2; 
console.log(a.a, b.a); //1,2 

但是,執行完整的副本真的很複雜。查看更多:How do I correctly clone a JavaScript object?

PS:您提到的new關鍵字用於創建對象,如class es。

function Car(n, y){        //This is called a "constructor" 
    var name = n, year = y;      //Private variables 
    return { 
     getName: function(){ return name; },  //Getters 
     getYear: function(){ return year; } 
    }; 
} 
var myNewCar = new Car("Toyota", 2010); 
myNewCar.getName(); //"Toyota" 
myNewCar.getYear(); //2010 

(這也是您如何在Java中創建對象,如果你已經採取了那些CS課程,你會認識到這種模式。)

+0

我會upvote,但這並不能解釋如何實現分離的對象 –

+0

@RJJordan - 我仍在編輯,實際上。 –

1
var tn = t; 

只是使雙方tnt到指向內存中的同一個對象。所以,一個對象的改變也會反映在其他對象中。你可以克隆這個對象,像這樣

function copyObject(sourceObject) { 
    var result = {}; 
    for (var key in sourceObject) { 
     if (sourceObject.hasOwnProperty(key)) { 
      result[key] = sourceObject[key]; 
     } 
    } 
    return result; 
} 
var tn = copyObject(t); 
+0

謝謝。但是我們必須爲此使用json? –

+0

@ C-link我們可以編寫一個幫助函數,就像我在答案中顯示的那樣。 – thefourtheye

0

你在問複製一個JSON對象。

var tn={}; 
for (key in t) tn[key]=t[key]; 

可能還有其他「更漂亮」的方法,但這可以保證克隆。

+0

這隻會執行淺拷貝。如果需要深層複製,該怎麼辦?例如,如果像這樣複製,'getCellCount'將引用內存中相同的函數對象。對於這種特殊情況,這可能不會產生有意義的後果,但是如果其中一個屬性是另一個JS對象,那麼它的確會有意義 – ajp15243

+0

你說得對。上下文很重要。我認爲這個問題已經取得了自己的一生,並演變爲「如何複製一個通用的JSON對象」。正如您所指出的,我的解決方案不適用於一般情況,需要進行深層複製。 – Schien

0

javascript中的=運算符只是改變了對象指向的內容,因此它不會創建原始對象的副本。您可以看看here以查看可能的方法來創建該對象的clone

0

如果你想創建一個JavaScript對象,傳統的方法是創建一個功能:

// Use capitalized names for Object-creating functions. 
// I guessed that you wanted a matrix of some sort. 
function Matrix(rows, columns) { 
    this.rows = rows; 
    this.columns = columns; 
    this.cellCount = function() { 
     return this.rows * this.columns; 
    } 
    this.dimensions = function() { 
     return this.rows, + ", " + this.columns; 
    } 
    this.copy = function() { 
     return new Matrix(this.rows, this.columns); 
    } 
} 

var t = new Matrix(6, 3); 

有更復雜的方式來做到這一點,利用Object.create。看看Javascript:好的部分

相關問題