Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Is-javascript对象中放置函数是一种好的做法吗?_Javascript_Performance_Object - Fatal编程技术网

在Is-javascript对象中放置函数是一种好的做法吗?

在Is-javascript对象中放置函数是一种好的做法吗?,javascript,performance,object,Javascript,Performance,Object,我制作了一个构造器,并计划制作大量的对象 function Cat(name) { this.name = name; this.meow = function () { ... ... } } 比如,函数meow()是一个非常冗长的过程。如果我创建了很多cat,它会成为一个内存问题吗?还是javascript会处理它?在这种情况下,创建静态函数比在对象中创建函数更好吗?最好使用原型 function Cat(name) {} Cat.

我制作了一个构造器,并计划制作大量的对象

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

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

比如,函数meow()是一个非常冗长的过程。如果我创建了很多cat,它会成为一个内存问题吗?还是javascript会处理它?在这种情况下,创建静态函数比在对象中创建函数更好吗?

最好使用原型

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

不过,BERTER会变成一个微观优化吗?这实际上取决于您的实现和环境


要更全面地解释原型增强性能的方式,请参阅V8开发人员Toon Verwaest的这篇中等解释。

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

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

简短回答:不贵长答案:研究函数式编程与面向对象编程。通过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游戏中使用了这种格式,里面有很多函数,它没有显示任何负面效果) (表演)


通常你把函数放在原型中,而不是放在每个实例中。你是否有意避免?使用它们可以消除问题;JS解释器应该自动使用最有效的解决方案,而不必担心您是否意外地为每个实例创建了闭包(实际上,它基本上是为您创建一个原型,每个方法都有一个副本)。不管
meow
函数是否冗长。它为每个实例创建一个新的函数对象,如果有无数实例,这将成为一个问题。正文的代码大小不会影响其中一个函数对象所使用的内存。@ShadowRanger不确定“它基本上是用每个方法的一个副本创建一个原型”是什么意思?@Bergi:其他答案中给出的解决方案,手动将函数附加到
Cat.prototype
,a la
Cat.prototype.meow=function(){}
是现代
语法在幕后自动执行的功能。函数创建一次,单个副本绑定到原型。当您尝试查找
实例时,
Cat
的每个实例都会找到单个副本。meow
forEach
不是函数式编程。我真的不知道这是怎么回答这个问题的,你的
Cat
构造函数仍然和OP的代码有相同的问题。我的“Cat”示例没有问题。如上所述,我在Node.Js中制作了一个相当强大的javascript游戏,每个元素(玩家、物品等)都使用了这个系统。这是一场MOBA比赛,所以在同一个场地上有很多球员,我没有看到任何表现问题。另外,我说的是array.forEach而不是forEach(…)。这里有一篇文章解释得很好:“很多玩家”意味着什么,几百个?是的,我说的是数组方法。仅仅使用一个回调函数并不能使某些东西起作用。也许我用词不对。我的意思是,很明显,这是一个成本,我只是说这是非常小的,不明显的,不会导致OP的计算机崩溃,因为他创造了10000只猫。为了回答您的问题,一次有10名玩家(MOBA-like league of legends,它是5v5)“如果使用this.meow,那么在每个实例化中都会定义一个自定义隐藏路径”-听起来不太正确。我是不是误解了你的意思?@Bergi-我不确定?让我来扩展一下,你可以告诉我。使用
this.meow
附加函数将是转换对象的一部分,该对象使用隐藏类创建整个隐藏路径,使用
new Cat()
时会发现并创建该路径。使用原型将为该原型对象创建一个特定的隐藏类,该类将被重用,并且在每次使用
new Cat()
时不需要创建该类。所有
Cat
对象的转换路径和隐藏类都是相同的,不需要每次调用构造函数时都创建该类,这就是系统的全部要点。@Bergi-我不认为Cat类的所有实现都是一样的。转换路径将与先前调用构造函数的路径相同,但是,它将与使用
this附加属性的修改版本不同。
。我相信每次都需要发现它们,因为它们不是使用构造函数本身添加的,而是在创建对象后执行的函数中添加的。这就是使用原型(使用定制路径初始化)与不使用原型(每次都需要修改)之间的核心区别。我们在这里讨论的是相同的代码吗?
Cat
类只有一个实现。当构造函数初始化属性时,所有实例化都将遵循相同的隐藏类转换路径(在第一次调用时创建的),并且属性值是函数还是其他东西完全不重要。不确定您所说的“不是在构造函数本身中,而是在对象创建后执行的函数中”是什么意思。这些方法不创建新属性吗?
  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();