Javascript-在闭包内使用函数构造函数不是一个好主意吗?

Ben

我想知道在闭包中使用函数构造函数时是否存在任何内存或性能问题?

这是一个粗略的示例,我知道有很多不同的更好的编写方法,我只是想提供一个示例,其中每个构造函数现在都可以访问闭包中的变量(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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

广泛使用Factory构造函数是一个好主意吗?

来自分类Dev

在Javascript中以“功能形式”的if-as-expression是一个好主意吗?

来自分类Dev

从全局范围内的另一个函数调用函数构造函数的方法-Javascript

来自分类Dev

在C ++构造函数中循环是一个好主意吗?

来自分类Dev

使用闭包和函数的javascript模块

来自分类Dev

JavaScript函数,闭包等内部的JavaScript函数

来自分类Dev

使用外部变量引用其他变量的闭包Javascript构造函数

来自分类Dev

应该使用Function构造函数形成一个闭包吗?

来自分类Dev

Javascript闭包-父函数

来自分类Dev

使用goto避免深度函数调用中的堆栈溢出是一个好主意吗?

来自分类Dev

使用“ is”检查变量中包含哪个函数是一个好主意吗?

来自分类Dev

简单的函数声明会在JavaScript中形成闭包吗?

来自分类Dev

使用数据库主键构造http ETag标头不是一个好主意吗?

来自分类Dev

JavaScript TypeError:$(...)。parent不是一个函数

来自分类Dev

JavaScript错误:$(...)。observe不是一个函数

来自分类Dev

kendo javascript t.find不是一个函数

来自分类Dev

javascript-indexOf不是一个函数

来自分类Dev

Javascript闭包(使用参数名称在同一函数中定义对象)

来自分类Dev

通过一个小示例了解JavaScript闭包

来自分类Dev

剖析一个简单的 Javascript 闭包

来自分类Dev

您可以使用一个提交按钮执行两个javascript函数吗

来自分类Dev

为什么不先通过实例的复制构造函数复制实例就持有一个实例不是一个好主意?

来自分类Dev

绑定PasswordBox密码不是一个好主意吗?

来自分类Dev

JavaScript闭包返回递归函数

来自分类Dev

如何从闭包调用javascript类函数

来自分类Dev

如何覆盖javascript闭包函数调用

来自分类Dev

JavaScript闭包返回函数

来自分类Dev

Javascript闭包和异步函数参数

来自分类Dev

如何覆盖javascript闭包函数调用

Related 相关文章

  1. 1

    广泛使用Factory构造函数是一个好主意吗?

  2. 2

    在Javascript中以“功能形式”的if-as-expression是一个好主意吗?

  3. 3

    从全局范围内的另一个函数调用函数构造函数的方法-Javascript

  4. 4

    在C ++构造函数中循环是一个好主意吗?

  5. 5

    使用闭包和函数的javascript模块

  6. 6

    JavaScript函数,闭包等内部的JavaScript函数

  7. 7

    使用外部变量引用其他变量的闭包Javascript构造函数

  8. 8

    应该使用Function构造函数形成一个闭包吗?

  9. 9

    Javascript闭包-父函数

  10. 10

    使用goto避免深度函数调用中的堆栈溢出是一个好主意吗?

  11. 11

    使用“ is”检查变量中包含哪个函数是一个好主意吗?

  12. 12

    简单的函数声明会在JavaScript中形成闭包吗?

  13. 13

    使用数据库主键构造http ETag标头不是一个好主意吗?

  14. 14

    JavaScript TypeError:$(...)。parent不是一个函数

  15. 15

    JavaScript错误:$(...)。observe不是一个函数

  16. 16

    kendo javascript t.find不是一个函数

  17. 17

    javascript-indexOf不是一个函数

  18. 18

    Javascript闭包(使用参数名称在同一函数中定义对象)

  19. 19

    通过一个小示例了解JavaScript闭包

  20. 20

    剖析一个简单的 Javascript 闭包

  21. 21

    您可以使用一个提交按钮执行两个javascript函数吗

  22. 22

    为什么不先通过实例的复制构造函数复制实例就持有一个实例不是一个好主意?

  23. 23

    绑定PasswordBox密码不是一个好主意吗?

  24. 24

    JavaScript闭包返回递归函数

  25. 25

    如何从闭包调用javascript类函数

  26. 26

    如何覆盖javascript闭包函数调用

  27. 27

    JavaScript闭包返回函数

  28. 28

    Javascript闭包和异步函数参数

  29. 29

    如何覆盖javascript闭包函数调用

热门标签

归档