我想知道在闭包中使用函数构造函数时是否存在任何内存或性能问题?
这是一个粗略的示例,我知道有很多不同的更好的编写方法,我只是想提供一个示例,其中每个构造函数现在都可以访问闭包中的变量(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();
我猜在这个例子中,它没有什么区别,但是如果母牛,绵羊和山羊的体积大而复杂,而我们要建立许多农场,这种方法会有什么弊端吗?
每次创建服务器场时,都会将一组新的构造函数存储到内存中吗?
更新
因此,我对KemalDağ所说的以及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()移到了原型中。我认为我确实在寻找一种解决方案,该解决方案允许我在所有实例之间共享变量,而无需在全局范围内添加任何内容。我最终决定将一个对象传递给每个实例而不是构造函数,这意味着我不必在构造函数上将它们公开。谢谢你们。
每次创建服务器场时,都会将一组新的构造函数存储到内存中吗?
是。但是,如果它们确实需要访问lastToSpeak
可能是合理的闭包变量(如),就像特权方法一样。有私有的构造函数可能有点奇怪,但是可能是必需的。
当您处理一组相似(但作用域不同)的构造函数时,可以通过性能优化为它们提供一个通用的原型对象。如果原型方法也不需要访问闭包变量,则在Farm
构造函数外部使用静态对象,并将其分配给每个特权构造函数。
我更改了代码以使用原型,这似乎是更好的方法吗?
不是这样 构造函数不应是实例方法,将它们放在原型对象上很奇怪。最好将它们Farm
作为名称空间放在函数对象上。
这是一个公开一切,崇拜原型的示例:
function Farm(animalList, farmer){
this.farmer = farmer;
this.lastToSpeak = "";
this.animals = [];
for(var i = 0; i < animalList.length; i++){
var name = animalList[i];
if (Farm.hasOwnProperty(name))
this.animals.push(new Farm[name](this));
}
}
Farm.prototype.allSpeak = function(){
for(var i = 0; i < this.animals.length; i++){
this.animals[i].speak();
}
};
function Animal(farm) {
this.farm = farm;
farm.lastToSpeak = "A "+this.type;
}
Animal.prototype.speak = function(){
alert("I'm a "+this.type+" and I belong to "+this.farm.farmer);
};
Animal.create = function(name) {
Farm[name] = function() {
Animal.apply(this, arguments);
};
Farm[name].prototype = Object.create(Animal.prototype);
Farm[name].prototype.type = name;
};
Animal.create("Goat");
Animal.create("Sheep");
Animal.create("Cow");
myFarm = new Farm(["Cow","Goat"],"Old MacDonald");
myFarm.allSpeak();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句