JavaScript最佳实践原型

JavaScript最佳实践原型,javascript,object,prototype,Javascript,Object,Prototype,我在构造函数的原型中有一个函数: function Animal(name) { this.name = name } Animal.prototype.generateToys = function(numberOfToys) { if(numberOfToys == 1) { this.createToys(); } else { this.createToys(); } } 仍然需要声明createToys。这就是我的问题指向的地方。假设gener

我在构造函数的原型中有一个函数:

function Animal(name) {
  this.name = name
}

Animal.prototype.generateToys = function(numberOfToys) {
  if(numberOfToys == 1) {
    this.createToys();
  } 
  else {
    this.createToys();
  }
}
仍然需要声明
createToys
。这就是我的问题指向的地方。假设
generateToys
将是调用
createToys()
的唯一方法,那么最好在方法
generateToys
内部创建
createToys
如下:

function Animal(name) {
  this.name = name
}

Animal.prototype.generateToys = function(numberOfToys) {
  if(numberOfToys == 1) {
    this.createToys();
  } 
  else {
    this.createToys();
  }

  function createToys() {
    ...
    ...
    ...
  }
}
或者您会将其创建为如下所示的方法(原型):

Animal.prototype.createToys = function() {
  ...
  ...
  ...
}

什么更好?为什么?:)

如果将其放入
generateToys()
方法中,则每次调用该方法时都会重新声明它,然后在该方法完成时将其从范围中删除。大多数情况下,这不是您想要的,因此您更愿意将其作为单独的方法创建。

这取决于您的体系结构


如果您计划有许多
Animal
的实例,那么将您的方法添加到原型中会更好,否则您将创建大量的私有函数,这将是非常昂贵的(从性能方面来说)


在原型上声明它意味着您的每个实例都可以直接调用它,并且您在内存中只有一个带有该声明的位置,因为原型本身是所有实例共享的单个引用

视情况而定。是否希望对象的任何实例都可以直接访问createToys?或者你想让他们经历几代人?既然你有一个if在generateToys中,我猜你希望它们总是通过generateToys,所以函数应该是私有的,最好的解决方案是有效的。您的第一个建议没有将
createToys
作为实例的属性,因此调用
this.createToys()
将失败(即它不起作用)。但是,即使您解决了这个问题,为什么每次调用
generateToys
时都必须重新创建
createToys
?这似乎没有必要(至少以你的例子为例)。定义函数一次。你在哪里做(
prototype
,函数在“类”之外)其实并不重要。我建议你看一看Douglas Crockford的演讲,function the Ultimate(),它揭示了创建对象的各种方法?
Animal.prototype.generateToys = function(numberOfToys) {
   var createToys = function createToys() { 

   }

})