如何在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
相关产品推荐
相关产品推荐

