为什么最新的值会覆盖到javascript中的对象数组中? #我的画布{ 宽度:500px; 高度:450px; 边框:2倍纯绿; 字体大小:30px; } window.onload=函数(){ vcan={}; vcan.main={} vcan.main.repNode=[]; vcan.main.currentTransform={'id':0,'name':'myobj'} document.getElementById(“mycanvas”).addEventListener(“mousemove”,mymousemove); 函数mymousemove(){ var currAdTime=new Date().getTime(); console.log(currAdTime); var myObj=extend(vcan.main.currentTransform,{mdTime:currAdTime,func:'add'}) vcan.main.repNode.push(myObj); } 功能扩展(fobj、sobj){ if((typeof fobj=='object')&&(typeof sobj=='object')){ 用于(sobj中的var prop){ fobj[prop]=sobj[prop]; } 返回fobj; }否则{ 警告(“您传递的参数似乎不是对象”); } } document.getElementById(“测试”).onclick=function(){ var输出=”; 对于(var i=0;i
为了解决问题,请将以上代码呈现到浏览器中。单击ShowResult按钮后,将显示时间。我的问题是为什么所有的时间都在显示 最新的时间值被覆盖到对象数组的不同元素中 同时,如果我们看到控制台,那么时间就会不同为什么最新的值会覆盖到javascript中的对象数组中? #我的画布{ 宽度:500px; 高度:450px; 边框:2倍纯绿; 字体大小:30px; } window.onload=函数(){ vcan={}; vcan.main={} vcan.main.repNode=[]; vcan.main.currentTransform={'id':0,'name':'myobj'} document.getElementById(“mycanvas”).addEventListener(“mousemove”,mymousemove); 函数mymousemove(){ var currAdTime=new Date().getTime(); console.log(currAdTime); var myObj=extend(vcan.main.currentTransform,{mdTime:currAdTime,func:'add'}) vcan.main.repNode.push(myObj); } 功能扩展(fobj、sobj){ if((typeof fobj=='object')&&(typeof sobj=='object')){ 用于(sobj中的var prop){ fobj[prop]=sobj[prop]; } 返回fobj; }否则{ 警告(“您传递的参数似乎不是对象”); } } document.getElementById(“测试”).onclick=function(){ var输出=”; 对于(var i=0;i,javascript,arrays,object,overriding,Javascript,Arrays,Object,Overriding,为了解决问题,请将以上代码呈现到浏览器中。单击ShowResult按钮后,将显示时间。我的问题是为什么所有的时间都在显示 最新的时间值被覆盖到对象数组的不同元素中 同时,如果我们看到控制台,那么时间就会不同 经过长时间的搜索,我无法解决这个问题。请大家帮我解决这个问题。这里有一个固定的解决方案。JS中的对象是通过引用而不是通过复制其值来分配的,因此mymousemove中的myObj总是修改相同的值。在扩展之前,只需复制vcan.main.currentTransform。这里有一个固定的解决方
经过长时间的搜索,我无法解决这个问题。请大家帮我解决这个问题。这里有一个固定的解决方案。JS中的对象是通过引用而不是通过复制其值来分配的,因此
mymousemove
中的myObj
总是修改相同的值。在扩展之前,只需复制vcan.main.currentTransform
。这里有一个固定的解决方案。JS中的对象是通过引用而不是通过复制其值来分配的,因此mymousemove
中的myObj
总是修改相同的值。扩展之前只需复制vcan.main.currentTransform
。只需将扩展函数替换为此函数即可
<html>
<head>
<style type="text/css">
#mycanvas{
width:500px;
height:450px;
border:2px solid green;
font-size:30px;
}
</style>
<script>
window.onload = function (){
vcan = {};
vcan.main = {}
vcan.main.repNode = [];
vcan.main.currentTransform = {'id':0, 'name':'myobj'}
document.getElementById("mycanvas").addEventListener('mousemove', mymousemove);
function mymousemove(){
var currAdTime = new Date().getTime();
console.log(currAdTime);
var myObj = extend(vcan.main.currentTransform , {mdTime:currAdTime, func:'add'})
vcan.main.repNode.push(myObj);
}
function extend (fobj, sobj){
if((typeof fobj == 'object') && (typeof sobj == 'object')){
for(var prop in sobj){
fobj[prop] = sobj[prop];
}
return fobj;
}else{
alert("it seems that the arguments you passed are not object");
}
}
document.getElementById("test").onclick = function (){
var output = "";
for(var i=0; i< vcan.main.repNode.length; i++){
output += vcan.main.repNode[i].mdTime;
output += "<br />";
}
document.getElementById("result").innerHTML = output;
}
}
</script>
</head>
<body>
<div id="mycanvas">
Please move the mouse inside this box
And click on Show Result
</div>
<button id="test">
Show Result
</button>
<div id="result">
</div>
</body>
</html>
只需用这个函数替换扩展函数
<html>
<head>
<style type="text/css">
#mycanvas{
width:500px;
height:450px;
border:2px solid green;
font-size:30px;
}
</style>
<script>
window.onload = function (){
vcan = {};
vcan.main = {}
vcan.main.repNode = [];
vcan.main.currentTransform = {'id':0, 'name':'myobj'}
document.getElementById("mycanvas").addEventListener('mousemove', mymousemove);
function mymousemove(){
var currAdTime = new Date().getTime();
console.log(currAdTime);
var myObj = extend(vcan.main.currentTransform , {mdTime:currAdTime, func:'add'})
vcan.main.repNode.push(myObj);
}
function extend (fobj, sobj){
if((typeof fobj == 'object') && (typeof sobj == 'object')){
for(var prop in sobj){
fobj[prop] = sobj[prop];
}
return fobj;
}else{
alert("it seems that the arguments you passed are not object");
}
}
document.getElementById("test").onclick = function (){
var output = "";
for(var i=0; i< vcan.main.repNode.length; i++){
output += vcan.main.repNode[i].mdTime;
output += "<br />";
}
document.getElementById("result").innerHTML = output;
}
}
</script>
</head>
<body>
<div id="mycanvas">
Please move the mouse inside this box
And click on Show Result
</div>
<button id="test">
Show Result
</button>
<div id="result">
</div>
</body>
</html>
extend函数中出现了一些错误。我不确定建议的输出应该是什么,但是这个函数返回的对象总是有相同的时间。也许你应该把sobj还给我??这说明循环可能没有做你想做的事情。我添加了一个
console.log(myObj)代码>在创建之后,这表明每次myObj都会使用相同的时间。如果您需要更多帮助,我建议您在文本中添加您希望的输出
向Pablo致意。扩展函数出现问题。我不确定建议的输出应该是什么,但是这个函数返回的对象总是有相同的时间。也许你应该把sobj还给我??这说明循环可能没有做你想做的事情。我添加了一个console.log(myObj)代码>在创建之后,这表明每次myObj都会使用相同的时间。如果您需要更多帮助,我建议您在文本中添加您希望的输出
向巴勃罗致意。fiddle:fiddle:{}
可以用来代替Object()
谢谢阿米尔,你看到我在比约德邮报上的评论了吗。请阅读。这取决于你的课程目的。正是在这段代码中,如果我是你,不用考虑编写整个程序,我就可以创建一个新对象,而不用调用extend。但是如果你提到你的程序目标,我们可以在性能方面提供更多帮助。好的..我有一个数组,它有很多对象,同时特定的对象具有平均属性。所以如果我遵循你们的方法,那么数组中所有对象的所有属性都是copy,在这种情况下,我认为性能很重要。我希望比约德在听。我已经读了你的代码,我想你可以用字典之类的东西,而你的部分数据没有变化,我猜你有很多。你知道怎么做吗?var Dic={Key:YOURKEY,Value:[]}{}
可以用来代替Object()
谢谢阿米尔,你看到我在BjordPost上的评论了吗。请阅读。这取决于你的课程目的。正是在这段代码中,如果我是你,不用考虑编写整个程序,我就可以创建一个新对象,而不用调用extend。但是如果你提到你的程序目标,我们可以在性能方面提供更多帮助。好的..我有一个数组,它有很多对象,同时特定的对象具有平均属性。所以如果我遵循你们的方法,那么数组中所有对象的所有属性都是copy,在这种情况下,我认为性能很重要。我希望比约德在听。我已经读了你的代码,我想你可以用字典之类的东西,而你的部分数据没有变化,我猜你有很多。你知道怎么做吗?var Dic={Key:YOURKEY,Value:[]}感谢您解决了这个问题。我很感激,但我有一个问题,那就是它不会成为aff吗