将函数放入javascript对象中是一种好习惯吗?

时间:2019-07-10 21:26:43

标签: javascript performance object

我创建了一个构造函数,并计划制作大量对象。

function Cat(name) {
    this.name = name;

    this.meow = function () {
        ...
        ...
    }
}

}

说,函数meow()很长。如果我创造了很多猫,或者Javascript会照顾它,这会成为内存问题吗?在这种情况下,创建静态函数而不是在对象内创建函数会更好吗?

3 个答案:

答案 0 :(得分:1)

为此最好使用原型。

function Cat(name) {}
Cat.prototype.meow = function(){};

大多数现代引擎(包括chrome的V8)会将对象创建优化为可重用的路径,而如果使用this.meow,则在每个实例化时都定义一个自定义的隐藏路径。

是否更好地转变为微优化?那真的取决于您的实现和环境。

要更详尽地说明原型增强性能的方式,请参见V8开发人员Toon Verwaest的这篇中等解释,Setting up prototypes in V8

答案 1 :(得分:1)

您可以将功能添加到Cat的原型中。这样,对meow的任何调用都将引用相同的函数。

Cat.prototype.meow = function() {};

答案 2 :(得分:0)

简短答案:这并不昂贵。 长答案:研究函数式编程与面向对象编程。使用JavaScript函数式编程,您可以做各种整洁的事情,例如:

function add(a, b)
{
   return a + b;
}

function subtract5(a)
{
   return a - 5; 
}

//You can pass functions into functions like:  subtract5(add(3, 3)) = 1;

然后,您还可以使用函数式编程语言,通过诸如find,forEach,map,reduce的函数使您的生活更轻松,例如,使用条件函数将其应用于您正在使用的数组...例如:

 function condition(x)
 {
  return x.id == 2;
 }
 var users = []
 users.push({ 
  id:1,
  name:"Bob"
 });
 users.push({ 
  id:2,
   name:"Dan"
 })
// users.find(condition).name is equal to Dan
//The condition function can be a lot of things which is why it's so powerful

另一个很好的例子(我在具有很多内部函数的javascript游戏中使用了这种格式,但没有负面影响 性能)

  var Cat = function(param)
 {
    var self = {}; 
    self.name = param.name;
    self.age = param.age;
    self.birthday = function()
    {
      self.age++;
    }
    return self;
 } 
  var youngCat = new Cat({name: "Ginger", age: 2});
  youngCat.birthday();