如何在循环中Object.create()?

时间:2018-03-19 15:56:28

标签: javascript

我在网上找到的循环对象创建示例使用new关键字,我想使用Object.create()。

我的尝试在第29行返回错误: https://jsfiddle.net/ynfkev6c/2/

function my_game() {
var cols = 11;
var rows = 11;
var num = cols * rows;
var size = 50;
var spacing = 5;

var square = {
    size: 50,
    x: 0,
    y: 0
}

var piece = {
    size: 50,
    x: 0,
    y: 0,
    name: king
}


function make_grid() {
    var squares = [];
    for (i = 0; i < rows; i++) {
        for (j = 0; j < cols; j++) {
            squares.push({ // ??
                Object.create(square); // ??
                x: i; // ??
                y: j; // ??
            })
        }
    }
}

}

如果你是我,你会怎么找到这个答案?

6 个答案:

答案 0 :(得分:2)

您不能在对象文字中使用Object.create。你需要写

function make_grid() {
    var squares = [];
    for (var i = 0; i < rows; i++) {
        for (var j = 0; j < cols; j++) {
            var o = Object.create(square);
            o.x = i;
            o.y = j;
            squares.push(o);
        }
    }
    return squares;
}

或者如果您需要一个没有临时变量的更简洁的解决方案,

squares.push(Object.assign(Object.create(square), { 
    x: i,
    y: j,
}));

答案 1 :(得分:1)

改变你的内循环:

for (i = 0; i < rows; i++) {
    for (j = 0; j < cols; j++) {
        let sq = Object.create(square)
        sq.x = i
        sq.y = j
        squares.push(sq)
    }
}

答案 2 :(得分:1)

我可以通过传入ij参数来使用函数创建对象,然后将其推送到数组:

function createSquare(x, y) {
  return { size: 50, x, y }
}

...

for (j = 0; j < cols; j++) {
  squares.push(createSquare(i, j));
}

答案 3 :(得分:0)

创建对象,然后设置或指定属性:

var obj = Object.create(square);
squares.push(Object.assign(obj, {x: i, y: j }));

或设置属性:

var obj = Object.create(square);
obj.x = i;
obj.y = j;
squares.push(obj);

答案 4 :(得分:0)

首先,在squares.push中,您开始对象表示法,它需要逗号,而不是键之间的分号:

squares.push({ // ??
    Object.create(square); // ??
    x: i; // ??
    y: j; // ??
})

// should be

squares.push({
    // Object.create(square), // we'll address this in a bit
    x: i,
    y: j,
})

此外,我不确定您是打算只推送新对象还是合并值x: i, y: j,但您可以轻松完成第一项:

squares.push(Object.create(square))

如果您有ES6支持,那么第二个很容易:

// This will merge the created object with the new values 
squares.push({
    ...square,
    x: i,
    y: j,
})

答案 5 :(得分:0)

squares.push({...})将创建对象数组。每个对象都需要键和值。 squares.push({Object.create(square);既没有创建密钥或值

该片段可以替换为

squares.push({ // ??
          'a': Object.create(square), // ??
          x: i, // ??
          y: j, // ??
        })

完整摘要

function my_game() {
  var cols = 11;
  var rows = 11;
  var num = cols * rows;
  var size = 50;
  var spacing = 5;

  var square = {
    size: 50,
    x: 0,
    y: 0
  }

  var piece = {
    size: 50,
    x: 0,
    y: 0,
    name: king
  }


  function make_grid() {
    var squares = [];
    for (i = 0; i < rows; i++) {
      for (j = 0; j < cols; j++) {
        squares.push({ // ??
          'a': Object.create(square), // ??
          x: i, // ??
          y: j, // ??
        })
      }
    }
    console.log(squares)
  }

}