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 :(得分:5)
tn
和t
都指向同一个对象,这就是为什么当您更改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;
只需让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);
答案 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:好零件。