为什么最新的值会覆盖到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中的对象数组中? #我的画布{ 宽度: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。这里有一个固定的解决方

为了解决问题,请将以上代码呈现到浏览器中。单击ShowResult按钮后,将显示时间。我的问题是为什么所有的时间都在显示

最新的时间值被覆盖到对象数组的不同元素中

同时,如果我们看到控制台,那么时间就会不同


经过长时间的搜索,我无法解决这个问题。请大家帮我解决这个问题。

这里有一个固定的解决方案。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吗