我想知道在闭包中使用函数构造器是否会有任何内存或性能问题?
这里有一个简单的例子,我知道有很多不同且更好的编写方式,但我只是想提供一个例子,每个构造器现在都可以访问闭包中的变量(farmer、lastToSpeak和animals)。
// usage: myFarm = new Farm(["Cow","Goat"],"Old MacDonald");
function Farm(animalList, farmer){
var animals = [],
lastToSpeak = "";
function Cow(){
this.speak = function(){
alert("I'm a Cow and I belong to "+farmer);
}
lastToSpeak = "A Cow";
}
function Sheep(){
this.speak = function(){
alert("I'm a Sheep and I belong to "+farmer);
}
lastToSpeak = "A Sheep";
}
function Goat(){
this.speak = function(){
alert("I'm a Goat and I belong to "+farmer);
}
lastToSpeak = "A Goat";
}
for(var i = 0; i < animalList.length; i++){
switch(animalList[i]){
case "Cow":
animals.push(new Cow());
break;
case "Sheep":
animals.push(new Sheep());
break;
case "Goat":
animals.push(new Goat());
break;
}
}
this.allSpeak = function(){
for(var i = 0; i < animals.length; i++){
animals[i].speak();
}
}
}
myFarm = new Farm(["Cow","Goat"],"Old MacDonald");
myFarm.allSpeak();
我猜在这个例子中,这样做没有太大区别,但如果牛、羊和山羊更大、更复杂,并且我们创建了许多农场,这种方法会有任何缺点吗?
每次创建农场时,是否会将一组新的构造函数存储到内存中?
更新
所以我对Kemal Dağ所说的和Bergi的评论感到满意。
如果我按照Bergi的建议改用原型并传递农场,那么这似乎是更好的方法?
function Farm(animalList, farmer){
var animals = [],
lastToSpeak = "";
this.farmer = farmer;
for(var i = 0; i < animalList.length; i++){
switch(animalList[i]){
case "Cow":
animals.push(new this.Cow(this));
break;
case "Sheep":
animals.push(new this.Sheep(this));
break;
case "Goat":
animals.push(new this.Goat(this));
break;
}
}
this.allSpeak = function(){
for(var i = 0; i < animals.length; i++){
animals[i].speak();
}
}
}
Farm.prototype.Goat = function(farm){
this.speak = function(){
alert("I'm a Goat and I belong to "+farm.farmer);
}
farm.lastToSpeak = "A Goat";
}
Farm.prototype.Cow = function(farm){
this.speak = function(){
alert("I'm a Cow and I belong to "+farm.farmer);
}
farm.lastToSpeak = "A Cow";
}
Farm.prototype.Sheep = function(farm){
this.speak = function(){
alert("I'm a Sheep and I belong to "+farm.farmer);
}
farm.lastToSpeak = "A Sheep";
}
myFarm = new Farm(["Cow","Goat"],"Old MacDonald");
myFarm.allSpeak();
更新
我创建了一个fiddle,而不是在这里的问题中添加另一个版本。我完全分开了我的动物构造函数,并将speakAll()移到了原型中。我认为我真正寻找的解决方案允许我在各个实例之间共享变量,而不添加任何东西到全局范围内。最终,我决定向每个实例传递一个对象,而不是构造函数,这意味着我不必在构造函数上公开它们。谢谢大家。