Javascript:指定具有唯一随机属性的新对象

Javascript:指定具有唯一随机属性的新对象,javascript,arrays,constructor,Javascript,Arrays,Constructor,我正试图创建一个基于构造函数的对象数组。在创建构造对象的过程中,为每个对象分配一个ID&一个随机整数作为数组的第一个值 var defaults = { x: 0, y: 0, d: [1,1], // destination s: 2 // speed }; var stage = document.getElementById('stage'); var oM = function ( vars ) { var vars = vars; t

我正试图创建一个基于构造函数的对象数组。在创建构造对象的过程中,为每个对象分配一个ID&一个随机整数作为数组的第一个值

var defaults = {
  x: 0, 
  y: 0, 
  d: [1,1], // destination 


  s: 2 // speed 
};

var stage = document.getElementById('stage');

var oM = function ( vars ) {

    var vars = vars;

    this.fn = {};
    this.v = vars.v;

    this.i = vars.i;
    this.v.d = [ 0, 0 ];

    this.init = function( i ) {

        var r = Math.floor( Math.random() * 999);
        var d = Math.floor( Math.random() * 999);

        var e = document.createElement('div');
        e.id = 'bit-' + i;
        e.classList.add('bit', 'mob', 'test');

        stage.appendChild(e);

        this.v.x = r;
        this.v.d[0] = d;

        console.log( this.v.d );

        this.e = document.getElementById( 'bit-' + i );
        this.e.style.left = this.v.x ;

    };

    this.move = function() {

        var i = this.i;
        var p = this.v.x;  
        var d = this.v.d[0]; 
        var s = this.v.s; 
        var m = 'stay';

        if ( ( p > d && ( p - s ) <= d ) || ( p < d && ( p + s ) >= d ) ) {
            p = d;
        } else if ( p > d ) {
            // move W 
            p = p - s;
            m = 'west';
        } else if ( p < d ) {
            // move E
            p = p + s;
            m = 'east';
        } 

        // console.log('index: ' + i + ' x: ' + p + ': moved: ' + m + ' @' + s + ': toward: ' + d + ' from: ' + this.v.x);
        this.v.x = p;
        this.e.style.left = this.v.x ;
        console.log( this.v.d );

    }
};



var eng = {};

eng.arr = [];

eng.init = function() {

    for ( var i = 0; i < 20; i++ ) {

        var u = new oM( { 
            i: i,
            v: defaults
        });


        u.init( i );
        eng.arr.push( u );
        // console.log( t );

    };

}

eng.turn = function() { 

    for ( var i = 0; i < eng.arr.length; i++ ) {

        console.log( eng.arr[ i ].v.d );
      // eng.arr[ i ].move();

    };

};


var f = 0;

eng.init();




console.time('turn: 0');

window.run = function () {

    if (f <= 9.1300) {
        window.requestAnimationFrame( run );

        eng.turn();
        console.timeEnd('turn: ' + f);
        f = f + 1;
        console.time('turn: ' + f);

    };

};

run();
var默认值={
x:0,,
y:0,
d:[1,1],//目的地
s:2/速度
};
var stage=document.getElementById('stage');
var oM=函数(vars){
var vars=vars;
this.fn={};
这个.v=变量.v;
this.i=vars.i;
这个.v.d=[0,0];
this.init=函数(i){
var r=Math.floor(Math.random()*999);
var d=数学地板(数学随机()*999);
var e=document.createElement('div');
e、 id='位-'+i;
e、 添加('bit','mob','test');
第二阶段(e);
这个。v.x=r;
这个.v.d[0]=d;
console.log(this.v.d);
this.e=document.getElementById('bit-'+i);
this.e.style.left=this.v.x;
};
this.move=函数(){
var i=这个。i;
var p=这个v.x;
var d=该.v.d[0];
var s=该值;v.s;
var m=‘停留’;
如果((p>d&(p-s)=d)){
p=d;
}否则如果(p>d){
//移动W
p=p-s;
m=‘西’;
}否则如果(p
因为
v
(并且连续地,
v.d
)对于您创建的所有对象都是相同的哈希/对象。您在内存中改变相同的位置。每个对象的默认值


ID不会重复,因为您重新分配了对新对象的引用,而不是修改现有对象。

好的,这很有意义。是否使用object.assign()在这种情况下复制默认值是有意义的吗?它似乎工作得很好&这是我见过的最简单的解决方案。@MarcusWebb:不,它只做浅层克隆。你需要深度克隆(也克隆阵列)。啊,好的,我之前读过关于深度克隆的文章。非常感谢,我会继续。