JavaScript 创建新对象
Posted
技术标签:
【中文标题】JavaScript 创建新对象【英文标题】:JavaScript creating new objects 【发布时间】:2015-04-09 08:01:40 【问题描述】:目前我正在尝试同时运行两个拍卖实例,但是当我创建一个新对象时,它似乎与之前的对象完全相同。
代码:
这是创建新对象的代码:
AuctionSell._state = new auctionGen();
AuctionSell._state.init(i);
auctions.push(AuctionSell._state);
请注意,auctionGen()
是一个函数,它返回一个对象,其中包含拍卖本身的所有变量和逻辑。
function auctionGen()
return
//code
^ 这只是一个空白模板,用于显示对象的实际创建方式。
更新拍卖数组:
update : function(dt)
if(auctions.length > 0)
for(var i = 0; i < auctions.length; ++i)
if(!auctions[i]._expired)
auctions[i].update(dt);
else
auctions.splice(i, 1);
如您所见,我创建了新对象,然后将其推送到包含我的拍卖的数组中。这发生在拍卖的init
函数中,只有在创建新拍卖时才会调用该函数。我检查了两种拍卖状态的数据,它们包含要拍卖的不同车辆,但似乎创建新车辆会停止旧车辆。
示例:
如果我单独进行一场拍卖 - 取决于汽车 - 最终出价将始终高于其实际价值。但是,如果我同时进行这些拍卖,它肯定会被低估。
我刚刚同时进行了两次拍卖,第一辆车的价格是$18000
,但拍卖以$6370
的出价结束。第二辆车的估价为$57,000
,拍卖结束于$46428
。
所有出价均由 AI 完成,并且它们被编程为始终在高于车辆价值的某个点停止出价。仅在一次运行两个或多个拍卖时才会出现此问题。
问题
是否有另一种方法可以让我创建这些对象以使它们成为真正的新对象?截至目前,它们似乎相互干扰。
编辑:
将更新调用更改为以下内容后:
update : function(dt)
var i;
if(auctions.length > 0)
i = 0;
while(i < auctions.length)
if(!auctions[i]._expired)
auctions[i].update(dt);
++i;
else
auctions.splice(i, 1);
并将我的 ai
数组修复为不再是全局的,似乎问题现在只发生在第二次车辆拍卖中。 $57,000
车辆的竞标停在$17,198
,而我的$12,000
车辆停在$23,947
(预期行为)
【问题讨论】:
您是否使用过类似 firebug 的工具来查看这些对象的内部究竟是什么? 你的new
在这里几乎肯定是不必要的,除非你在auctionGen()
构造函数中使用this
,因为你是从auctionGen()
返回的。
auctionGen() 返回的对象是否碰巧引用了任何变量?
function auctionGen()
应该在初始化后返回this
p.s...我希望这些提前结束的拍卖不是真正的拍卖;)。
【参考方案1】:
您的update
代码中有一个错误:如果您删除一个条目(您的splice
调用),您不想增加i
,这会让您跳过条目——假设您有条目@987654324 @、1
和 2
;在处理1
时,将其删除;现在以前在2
的条目现在在1
,所以如果你增加i
,你会跳过它。
相反,如果您不删除条目,则仅增加 i
:
update : function(dt)
var i;
if(auctions.length > 0) // *** There's no reason to do this
i = 0; // *** Change on this line
while (i < auctions.length) // *** Change on this line
if(!auctions[i]._expired)
auctions[i].update(dt);
++i; // *** Note we increment `i`
else
auctions.splice(i, 1); // *** Removing, so don't increment `i`
【讨论】:
感谢您发现这一点,我现在已经更改了它,这实际上解决了第二辆车会被投标的问题,但是第一辆拍卖的车辆仍然会发生这种情况。更改我的ai
数组,因为它是全局的,我的帖子上的评论让我注意到,一旦我修复它,我会重新签入。
是的,如果你有一个全局数组,它不会是特定于实例的。 :-)
用结果更新了 OP【参考方案2】:
您不想在走过容器时不小心操作容器(本例中为数组)。在 C++ 中,这将被称为迭代器失效,但这里的想法是相同的:i
变得混乱并指向错误的数据。您的 splice
调用导致您的循环跳过一些条目。
【讨论】:
在数组中移动时删除条目是完全可以的,您只需要正确处理它,正如我在 10 分钟前解释的那样。 @T.J.Crowder 我添加了“粗心”这个词。我非常喜欢您的解释,但觉得值得将其类比为其他语言并为此问题引入现有术语。以上是关于JavaScript 创建新对象的主要内容,如果未能解决你的问题,请参考以下文章