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