我有“场景”图形“对象”......
Scene.prototype.objects=new Array();
Scene.prototype.add=function(obj){
var last=this.objects.length;
this.objects[last]=obj}
Scene.prototype.remove=function(obj){
this.objects.splice(obj.id,1)}
Scene.prototype.advance=function(){
for (var id in this.objects){
var obj=this.objects[id];
obj.id=id;
obj.advance();
}
}
Scene.prototype.paint=function(context){...}
每次创建和删除许多对象。 Array.prototype.splice重新索引数组吧?有没有人知道更好的技术(在javascript数组上添加和删除)?
在我看来,另一种可能性就是
Scene.prototype.remove=function(obj){
delete this.objects[obj.id]; // don,t care about this.objects.length
delete obj; // not necessary...
}
我还没试过......
我需要一本关于JavaScript的好书:)
答案 0 :(得分:2)
您的删除方法无效,因为objects
是一个数组,而obj.id是存储在该数组元素中的对象引用的ID。 splice
将是使用的方法,但您必须知道Array中元素的索引。也许你应该这样'记住':
Scene.prototype.add=function(obj){
var last=this.objects.length;
obj.objectsIndex = last;
this.objects[last]=obj
}
之后你可以:
Scene.prototype.remove=function(obj){
this.objects.splice(obj.objectsIndex,1)};
//reindex the objects within the objects Array
for (var i=0; i<this.objects.length;i++){
this.objects[i].objectsIndex = i;
}
}
注意:将objects
数组添加到Scene
构造函数的原型中意味着它对所有实例(静态)都是相同的,这是你想要的吗?
答案 1 :(得分:0)
我宁愿避免使用new Array()
而是使用[]
(我在评论中提到的书的第114页 - 道格拉斯克罗克福德的'JavaScript:The Good Parts'。)。
更重要的是,我不认为向Scene原型添加objects
数组会像您期望的那样工作。您可能希望实现一些面向对象的结构,这需要JavaScript中的一些杂技技能,因为它使用prototypal inheritance,因为它是无类别的。
尝试这样的事情:
var Scene = function(initial_objects) {
this.objects = initial_objects || [];
};
Scene.prototype.add = function(obj) {
this.objects.push(obj);
};
Scene.prototype.remove_by_index = function(index) {
this.objects.splice(index, 1);
};
Scene.prototype.remove = function(obj) {
var index = this.objects.indexOf(obj);
if (index > -1) {
this.objects.splice(index, 1);
}
};
答案 2 :(得分:0)
您的对象实际上并不需要数组。您可以使用另一个具有哈希表的对象:
(function() {
var i = 0;
Scene.prototype.objects = {};
Scene.prototype.add = function(obj) {
var id = i++;
this.objects[id] = obj;
obj.id = id;
};
Scene.prototype.remove = function(obj){
if(obj.id in this.objects) {
delete this.objects[obj.id];
}
};
Scene.prototype.advance=function(){
for (var id in this.objects){
var obj=this.objects[id];
obj.id=id;
obj.advance();
}
};
Scene.prototype.paint=function(context){...}
}());