我想知道在闭包中使用函数构造函数时是否存在任何内存或性能问题?
这是一个粗略的示例,我知道有很多不同且更好的方法来编写它,我只是想提供一个示例,每个构造函数现在都可以访问闭包中的变量(farmer、lastToSpeak 和动物)。
// 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();
更新
我整理了一个小提琴,而不是在此处为问题添加另一个版本。我已经完全分离了我的动物构造函数并将 speakAll() 移到原型中。我想我真的在寻找一种解决方案,它允许我在我的实例之间共享变量而不向全局范围添加任何东西。我最终决定将一个对象传递给每个实例而不是构造函数,这意味着我不必在构造函数上公开它们。多谢你们。