[英]Weird behavior when new operator inside a for loop
這段代碼:
for(var i = 0; i < count; ++i)
{
var coin = new Coin(mStage , { x : 0 , y : 0 });
coin.id = i;
mAvailableCoins.push(coin);
}
行為怪異。 我試圖觀察 mAvailableCoins[0] - [3] 的變量,發現它實際上根本沒有被推送。 正在推送的是 Coin 的單個實例,這是我創建的第一個實例。 這在我設置的 ID 中很明顯。
當我設置 mAvailableCoins[0] 時,它的 id 為 0。接下來將新創建的硬幣推入數組設置 id mAvailableCoins[1].id 為 1。這是預期的。 我檢查了 mAvailableCoins[0] 並且它的 id 也是 1。
我在我的代碼的不同 for 循環上運行它,它在那里工作。 它只是在這里失敗了。 這是我的工作示例,盡管它放在不同的文件/范圍/方法等上。
var coins = world.borrowCoins(mLength , heightCount);
var i = 0;
for(var x = 0; x < mLength; ++x)
{
for(var y = 0; y < heightCount; ++y)
{
//var coin = coins[i];
var coin = new Coin(mStage , {x : 0 , y : 0});
coin.x = mPosition.x + (x * world.blockSize);
coin.y = ChunkGroup.pixelHeight - ((y + 1) * world.blockSize);
coin.id = i;
world.addInhabitant(coin);
mStage.addChild(coin.sprite);
console.log("Coin id : " + coin.id + " position (" + x + " , " + y + ") pos : " + coin.x + " , " + coin.y);
i++;
}
}
[編輯] 這是我的 Coin.js,這是居民的子類:
define(["src/Inhabitant"], function(Inhabitant)
{
console.log("Coin.js loaded");
return (function(stage)
{
var mRunSpeed = 0;
var id = 0;
function Coin(stage)
{
Inhabitant.call(this, stage, 'coinGold.png');
}
Coin.prototype = Object.create(Inhabitant.prototype);
Coin.prototype.update = function(elapsed)
{
Inhabitant.prototype.x -= mRunSpeed * elapsed;
}
Object.defineProperty(Coin, 'runSpeed',
{
get : function(){ return mRunSpeed; }
, set : function(speed){ mRunSpeed = speed; }
});
Object.defineProperty(Coin, 'id',
{
get : function(){ return mRunSpeed; }
, set : function(speed){ mRunSpeed = speed; }
});
return Coin;
})();
});
所以這里它的父級 Inhabitant.js:
define([], function()
{
console.log("Inhabitant loaded.");
var Inhabitant = (function()
{
var mStage = null;
var mSprite = null;
var mID = -1;
function Inhabitant(stage, resource)
{
mStage = stage;
mSprite = new PIXI.Sprite.fromFrame(resource);
}
Inhabitant.prototype =
{
get sprite(){ return mSprite; }
, set position(position){ mSprite.position = position; } , get position(){ return mSprite.position; }
, get x(){ return mSprite.x; } , get y(){ return mSprite.y; }
, set x(x){ mSprite.x = x; }
, set y(y){ mSprite.y = y; }
, get id(){ return mID; } , set id(id){ mID = id; }
, update : update
, show : show
}
function update(elapsed)
{
console.log("Update called from Inhabitant");
}
function show(show)
{
mSprite.visible = show;
}
return Inhabitant;
})();
return Inhabitant;
});
這是調用循環的 World.js:
define(["src/Coin", "src/Block" , "src/ChunkGroup", "src/Chunk"] , function(Coin, Block , ChunkGroup, Chunk)
{
console.log("World loaded.");
return function(stage , position , viewportSize, screenSize , blockSize)
{
var onNewFloor = function(Chunk){};
var mStage = stage;
...
var mInhabitants = [];
var mAvailableCoins = [];
...
var mOnBorderlineChangedListener = { newBorderline : 0 };
...
function fillCoins(count)
{
for(var i = 0; i < count; ++i)
{
var coin4 = new Coin(mStage);
coin4.id = i;
mAvailableCoins.push(coin4);
}
...
}
function init(segmentCount, segmentLength)
{
...
showBackground();
fillRampGroups(100);
fillCoins(850);
...
}
return World;
};
});
這是 World 初始化並調用其方法 World.init(...) 的地方:
define(['src/Coin' , 'src/Runner2', 'src/World' , 'src/Chunk', 'src/ChunkGroup'] , function(Coin, Runner2, World, Chunk, ChunkGroup)
{
console.log("MainGameScene loaded.");
return function (renderer , screenSize)
{
var blockSize = 70;
var mStage = new PIXI.Container();
...
var mWorld = World(mStage, {x : 0 , y : 530}, {width : screenSize.width , height : screenSize.height} , mScreenSize , blockSize);
mWorld.runSpeed = 350;
mWorld.init(21, 7); // make sure that the length is odd number...
...
var MainGameScene = {};
...
return MainGameScene;
}
});
這是令人難以置信的。 我做錯了什么?
Coin 類的所有實例都使用(共享)相同的變量:
var mRunSpeed = 0;
var id = 0;
因為它們在您的 get/set 函數的外部范圍內。 將您的代碼更改為:
Object.defineProperty(Coin, 'id',
{
get : function(){ return this._id; }
, set : function(id){ this._id = id; }
});
你應該看到不同之處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.