You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Block构造函数内将新创建对象加入blockArray数组?

问题:如何在构造函数内自动将新创建的方块对象加入数组?

我目前正在开发一款平台游戏,其中包含大量用作墙体和平台的不同方块。为了检测玩家是否到达存在障碍物的位置,我需要遍历所有方块组成的数组。

我当然可以在创建对象后将其添加到数组中:

var blockArray = [];
var block1 = new Block();
blockArray.push(block1);

但说实话,我比较懒,而且这样代码会显得有些杂乱。有没有办法在构造函数内部将对象添加到数组中,类似这样:

var blockArray = [];
function Block () {
  blockArray.push(this.Block);
}

其中this.Block指代新创建的对象。

是否存在这样引用对象的方法?

提前感谢!


解答

当然有办法啦!你其实离正确写法只差一丢丢~

在JavaScript的构造函数里,this关键字就是指代刚创建的那个实例对象,所以根本不需要写this.Block,直接把this推入数组就可以了。

修正后的代码是这样的:

var blockArray = [];
function Block() {
  // 这里的this就是当前新生成的Block实例
  blockArray.push(this);
  
  // 你可以在这里继续写方块的初始化逻辑,比如位置、尺寸这些
}

这样每次你用new Block()创建新方块时,它都会自动被加入blockArray里,完全不用手动写push,完美符合你“懒”又想保持代码整洁的需求😎

另外给你个进阶小建议:如果不想把blockArray暴露成全局变量(避免污染全局作用域),可以把数组挂载到构造函数的静态属性上,这样代码会更模块化:

function Block() {
  // 直接用构造函数的静态数组来存实例
  Block.allBlocks.push(this);
  
  // 示例:初始化方块的位置和大小
  this.x = 0;
  this.y = 0;
  this.width = 64;
  this.height = 64;
}

// 在构造函数外部初始化这个静态数组
Block.allBlocks = [];

之后你要遍历所有方块的时候,直接用Block.allBlocks就可以了,比如检测碰撞的逻辑可以写成:

function checkCollision(player) {
  for (const block of Block.allBlocks) {
    // 这里写碰撞检测逻辑
    if (player.x < block.x + block.width &&
        player.x + player.width > block.x &&
        player.y < block.y + block.height &&
        player.y + player.height > block.y) {
      return true; // 检测到碰撞
    }
  }
  return false;
}

这样既实现了自动添加实例的需求,又让代码结构更清晰,是不是很棒?


内容的提问来源于stack exchange,提问作者user452094

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:42:31