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

Javascript 如何定义数组对象的变量类型的新对象?,javascript,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); //

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();//但似乎是错的


所以,如何从对象中检索旧的内在值,使其结果6、3
tn
t
都指向同一个对象,这就是为什么当您更改
tn.rows
时,它也会更改
t.rows
。没有所谓的
旧的内在价值

必须复制对象才能保留旧值。有两种:

复制键值对非常容易

现在,如果更改
newObj
中的值,则不会更改原始值:

var a = {a:1}, b = Object.create(a);
b.a = 2;
console.log(a.a, b.a);  //1,2
然而,执行完整的复制确实很复杂。请参阅更多:

注:您提到的
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课程,您会认识到这种模式。)

tn
t
都指向同一个对象,这就是为什么当您更改
tn.rows
时,它也会更改
t.rows
。没有所谓的
旧的内在价值

必须复制对象才能保留旧值。有两种:

复制键值对非常容易

现在,如果更改
newObj
中的值,则不会更改原始值:

var a = {a:1}, b = Object.create(a);
b.a = 2;
console.log(a.a, b.a);  //1,2
然而,执行完整的复制确实很复杂。请参阅更多:

注:您提到的
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课程,您会认识到这种模式。)

只需使
tn
t
指向内存中的同一对象即可。因此,一个对象中的变化也会反映在另一个对象中。可以像这样克隆对象

function copyObject(sourceObject) {
    var result = {};
    for (var key in sourceObject) {
        if (sourceObject.hasOwnProperty(key)) {
            result[key] = sourceObject[key];
        }
    }
    return result;
}
var tn = copyObject(t);
只需使
tn
t
指向内存中的同一对象即可。因此,一个对象中的变化也会反映在另一个对象中。可以像这样克隆对象

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

您正在请求克隆JSON对象

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

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

您要求克隆JSON对象

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

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

javascript中的
=
操作符只是更改对象指向的对象,因此它不会创建原始对象的副本。您可以查看创建对象的
克隆的可能方法。

javascript中的
=
操作符只是更改对象指向的对象,因此它不会创建原始对象的副本。您可以查看创建对象克隆的可能方法。

如果要创建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:好的部分。

如果要创建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:好的部分。

var tn=t不会克隆对象本身,它只是复制对该对象的引用。“”可能对另一个有帮助。那么,我怎样才能克隆出结果呢。但是,一个选项是so
tn
继承自
t
,而不是它们相同不会克隆对象本身,它只是复制对该对象的引用。“”可能对另一个有帮助。那么,我怎样才能克隆出结果呢。但是,有一个选项是如此
tn
继承自
t
,而不是它们是相同的。我想向上投票,但这并不能解释如何实现单独的对象我要向上投票,但这并不能解释如何实现分离objects@C-link我们可以像我在答案中所示那样编写一个帮助函数。@C-link我们可以像我在答案中所示那样编写一个帮助函数。这只会执行一个浅层复制。如果需要深度拷贝怎么办?例如,
getCellCount
将引用内存中的同一个函数对象,如果这样复制的话。对于这种特殊情况,这可能不会产生有意义的结果,但如果其中一个属性是另一个JS对象,则会产生影响。您是对的。背景确实很重要。我认为这个问题本身就存在,并发展到“如何复制通用JSON对象”。我的解决方案不适用于一般情况,如您所指出的,需要深度复制。这只会执行浅层复制。如果需要深度拷贝怎么办?例如,
getCellCount
将引用内存中的同一个函数对象,如果这样复制的话。对于这种特殊情况,这可能不会产生有意义的结果,但如果其中一个属性是另一个JS对象,则会产生影响。您是对的。背景确实很重要。我认为这个问题本身就存在,并发展到“如何复制通用JSON对象”。正如您所指出的,我的解决方案不适用于需要深度拷贝的一般情况。