如何定义变量类型的数组对象的新对象?

时间:2014-01-20 03:38:31

标签: javascript

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

5 个答案:

答案 0 :(得分: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课程,你就会认识到这种模式。)

答案 1 :(得分: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);

答案 2 :(得分:0)

您要求克隆JSON对象。

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

可能还有其他“更漂亮”的方法,但这可以保证克隆。

答案 3 :(得分:0)

javascript中的=运算符只会更改对象指向的内容,因此不会创建原始对象的副本。您可以查看here以查看创建对象clone的可能方法。

答案 4 :(得分: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:好零件