创建对象与常规对象的Javascript构造函数

创建对象与常规对象的Javascript构造函数,javascript,function,oop,object,functional-programming,Javascript,Function,Oop,Object,Functional Programming,很抱歉,标题可能有误导性,但我想知道为什么这种创建对象并添加属性和方法的方法是: //A) var myObjCreatedByFunction = function() { this.prop1 = "a"; this.func1 = function() { alert("a"); } }; 然后使用prototype创建其他方法 myObjCreatedByFunction.prototype.func2 = function() { ... } 优先于简单和简单的创

很抱歉,标题可能有误导性,但我想知道为什么这种创建对象并添加属性和方法的方法是:

//A)
var myObjCreatedByFunction = function() {
  this.prop1 = "a";
  this.func1 = function() {
   alert("a");
  }
};
然后使用prototype创建其他方法

myObjCreatedByFunction.prototype.func2 = function() { ... }
优先于简单和简单的创建对象:

//B)
var myObj = {
  prop1: "a",
  func1: function() {
   alert("a");
  }
};
只是通过以下方式添加新方法:

myObj.func2 = function() { ... }
正如我看到的,一些熟练的开发人员使用第一种方法并使用原型,即使他们以后从未创建新实例

此外,与这两个例子相比,IIFE是否更受欢迎?如果是,原因是什么?(我最近看到很多这种用法)


有人能解释一下我什么时候应该使用第一种方法,第二种和第三种方法,以及为什么?谢谢大家!

B仅对单个实例有用。它不提供一种方法来创建具有这些方法和属性的该类型的多个实例。如果您想要/需要的只是一个实例,那么B就可以了,而且可能更易于表达和遵循

关于是将原型用于方法还是在构造函数中分配它们,存在着长期的讨论(请参阅,还有很多其他类似的讨论)。使用原型,然后使用
new
操作符创建新对象将节省内存(因为所有方法都由所有实例共享)。在构造函数中分配它们允许访问私有实例变量(构造函数中的局部变量),并且在执行给定方法时具有稍好的性能


生活是一些人选择采用的一种模式。它对您正在做的事情没有任何好处,但提供了一个存储“私有类变量”的范围,这些变量由所有实例共享,但外部世界无法访问。按照您的显示方式,它不是我的最爱,因为在所有对象上都没有类型信息。它只是一个具有属性的普通对象。在某些情况下(特别是在调试中,但有时在编码中),了解对象的类型可能很有用。

请参见“谢谢”,但这只是部分答案。没有IIFE方法,也没有解释A和B方法之间的区别。“使用原型,即使他们以后从未创建新实例”???不,这些都不是熟练的开发人员。混入和继承可能是使用原型和构造函数的一个原因,即使只创建了一个实例,更多信息如下:有时您可以包装(其中的一些)在IIFE中创建私有函数或其他私有共享成员(如用于模拟受保护成员的box对象)的原型声明使用
对象。create
可用于创建对象文本的新实例,但比使用
new
和构造函数要慢得多。
var myObjIIFE = (function() {
return {
  prop1: "a",
  func1: function() {
   alert("a");
  }
}
})());