临时Javascript对象
Temp Javascript Objects
我以前遇到过这个问题,为了得到我需要的结果,我一直在努力,但最终还是遇到了困难,不明白为什么这种情况会一直发生。
在JavaScript中,如何只捕获不指向原始对象的浅副本 当我真正想做的是修改我创建的temp变量并使用MyGame.runAllPossibleMoves = function() {
MyGame.ai_object.board = MyGame.tetrominos;
MyGame.ai_object.piece = MyGame.tetromino;
for(var i = 0; i < 10; i++){
if(i < MyGame.ai_object.piece.pivot.x){
while(moveLeft() && i < MyGame.ai_object.piece.pivot.x){
//do piece movement
}
hardDrop();
}
console.log(MyGame.ai_object.piece.pivot.x + ',' + MyGame.ai_object.piece.pivot.y);
console.log(MyGame.tetromino.pivot.x + ',' + MyGame.tetromino.pivot.y);
MyGame.ai_object.board = MyGame.tetrominos;
MyGame.ai_object.piece = MyGame.tetromino;
//console.log(MyGame.ai_object.piece);
}
}
MyGame.tetromino
重置我的临时对象时,对象MyGame.tetromino
被更新为MyGame.ai_object.piece
。我哪里错了?
在最简单的情况下,假设没有任何东西具有不安全的扩展Object.prototype
:
Object.shallowCopy = function(obj) {
var r = Array.isArray(obj) ? new Array(obj.length) : {};
for (var k in obj) {
r[k] = obj[k];
}
return r;
}
由于这是一个浅层副本,任何"复制"的值本身就是一个对象,都将保留对原始值的引用。
等效函数存在于各种库中。特别是(没有与jQuery关联的DOM行李)undercore.js 中有_.clone
EDIT-对于深度复制,简单的递归应该足够了,再次假设Object.prototype
和Array.prototype
都没有被不安全地修改:
Object.deepCopy = function(obj) {
var r = obj;
if (typeof obj === 'object') {
r = Array.isArray(obj) ? new Array(obj.length) : {};
for (var k in obj) {
r[k] = Object.deepCopy(obj[k]);
}
}
return r;
}
注意:如果传递了一个包含对自身循环引用的结构,则此函数将无法完成。
在意识到我要求一个浅拷贝,但确实需要一个深拷贝(由于某种原因,我想是咖啡因不够)后,我在网络间和其他几个答案中发现了这一点:
MyGame.ai_object.board = (JSON.parse(JSON.stringify(MyGame.tetrominos)));
MyGame.ai_object.piece = (JSON.parse(JSON.stringify(MyGame.tetromino)));
这创造了我想要的深度复制。在意识到自己的错误后,我在SO上找到了其他几个答案。
编辑:
使用JSON.parse(JSON.stringfy(obj))会消耗大量资源。这里有一种获得深度复制的替代方法:
deepCopy = function(obj){
var temp;
for(var n in obj){
temp[n] = obj[n];
}
return temp;
}
这将复制obj中的每个项,并将其分配给新对象temp。这不会创建obj中任何对象的深度副本(您必须再次调用deepCopy)。
- 面向对象JavaScript中的私有函数
- 对象 Javascript 中的标签无效 - 想要添加事件列表器
- 将字符串转换为对象 javascript/jquery
- 正在检查对象javascript中是否存在嵌套属性
- 时间-日期对象JavaScript getUTCMilliseconds
- 仅在对象(javascript)中解析值
- 使用对象(JavaScript或jQuery)填充选择下拉列表
- 引用另一个对象javascript中的对象
- 如何删除列表中的对象?Javascript nodejs和下划线
- 无法从日期对象javascript获取日期和月份
- 如何在if语句中使用对象-Javascript
- 对象javascript错误
- 对象Javascript的少数实例
- 位置对象Javascript
- 将字符串传递到对象javascript中
- 获取对象Javascript或jQuery的最后一个值
- 鼠标接近对象Javascript
- 这个mixins代码是书中的错误吗;面向对象JavaScript的原理”;
- 使用闭包编译器编写更好的面向对象JavaScript完整示例代码
- 访问对象javascript数组中的对象属性值