我希望能够创建和未知数量的对象。我不确定是否有更好的方法来管理和引用它们。
让我们使用一个标准的OOP示例...说每次用户在文本字段中输入宠物的名称并单击按钮时,就会通过petFactory函数创建一个新的宠物对象。
function pet(name)
{
this.name= name;
}
function petFactory(textFieldInput)
{
var x = new pet(textFieldInput)
}
由于没有办法,我知道(除了eval函数),每次调用petFactory时动态地为宠物使用一个新的,唯一的变量名,x被重新分配给一个新对象而最后一只宠物丢失了。我一直在做的是在宠物对象初始化后将其推送到阵列上。
petArray.push(this);
所以,如果我想要名为'mrFuzzyButtoms'的宠物,我可以循环索引数组,直到找到具有实例变量'mrFuzzyButtoms'的对象
for (n in petArray)
{
if (petarray[n].name == 'mrFuzzyBottoms')
{
// Kill mrFuzzyBottoms
}
}
或者我可以使用关联数组...无论如何......但是数组是我知道的唯一方法。除了使用eval函数从字符串创建唯一的变量名称,但某些语言没有eval函数(actionscript3),然后存在安全风险。
有更好的方法吗?
修改: 现在我正在使用Python,JavaScript和ActionScript。
答案 0 :(得分:3)
“我可以使用关联数组”正确。
“数组是我知道的唯一方法。”
尽快了解“Mappings”或“Dictionaries”。你会发现它完全符合你的要求。
您使用的是哪种语言?如果您提供特定语言,我们可以提供指向该语言的“地图”结构的特定链接。
答案 1 :(得分:2)
这是什么集合类(列表,字典/映射,集合);收集一些实例。对于上面的情况,我可能会使用从名称到对象的地图(类名因语言而异)。
答案 2 :(得分:0)
#!/usr/bin/env python
"""Playing with pets.
"""
class Pet(object):
"""A pet with a name."""
def __init__(self, name):
"""Create a pet with a `name`.
"""
self._name = name
@property
def name(self): # name is read-only
return self._name
def __repr__(self):
"""
>>> eval(repr(self)) == self
"""
klass = self.__class__.__name__
return "%s('%s')" % (klass, self.name.replace("'", r"\'"))
def __eq__(self, other):
return repr(self) == repr(other)
name2pet = {} # combined register of all pets
@classmethod
def get(cls, name):
"""Return a pet with `name`.
Try to get the pet registered by `name`
otherwise register a new pet and return it
"""
register = cls.name2pet
try: return register[name]
except KeyError:
pet = register[name] = cls(name) # no duplicates allowed
Pet.name2pet.setdefault(name, []).append(pet)
return pet
class Cat(Pet):
name2pet = {} # each class has its own registry
class Dog(Pet):
name2pet = {}
def test():
assert eval(repr(Cat("Teal'c"))) == Cat("Teal'c")
pets = [Pet('a'), Cat('a'), Dog('a'), Cat.get('a'), Dog.get('a')]
assert all(pet.name == 'a' for pet in pets)
cat, dog = Cat.get('pet'), Dog.get('pet')
assert repr(cat) == "Cat('pet')" and repr(dog) == "Dog('pet')"
assert dog is not cat
assert dog != cat
assert cat.name == dog.name
assert all(v == [Cat(k), Dog(k)]
for k, v in Pet.name2pet.items()), Pet.name2pet
try: cat.name = "cat" # .name is read-only
except AttributeError:
pass
try: assert 0
except AssertionError:
return "OK"
raise AssertionError("Assertions must be enabled during the test")
if __name__=="__main__":
print test()