Javascript 构造函数创建 object 与常规 object

Javascript constructor function creating object vs regular object

抱歉,标题可能具有误导性,但我想知道为什么要使用这种创建 object 并添加属性和方法的方法:

//A)
var myObjCreatedByFunction = function() {
  this.prop1 = "a";
  this.func1 = function() {
   alert("a");
  }
};

然后使用原型创建其他方法

myObjCreatedByFunction.prototype.func2 = function() { ... }

优于简单明了的创建 object:

//B)
var myObj = {
  prop1: "a",
  func1: function() {
   alert("a");
  }
};

并通过

添加新方法
myObj.func2 = function() { ... }

我看到一些熟练的开发人员使用第一种方法并使用原型,即使他们以后从未创建新实例。

此外,使用 IIFE 是否优于这两个示例?如果是,为什么? (我最近看到很多这种用法)

var myObjIIFE = (function() {
return {
  prop1: "a",
  func1: function() {
   alert("a");
  }
}
})());

有人可以解释一下我什么时候应该使用第一种方法、第二种方法和第三种方法吗?为什么?谢谢!

B 仅对单个实例有用。它没有像 A 那样提供使用这些方法和属性创建该类型的多个实例的方法。如果你 want/need 只是一个实例,那么 B 就可以了,而且可能更容易表达和遵循。

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

IIFE 是一些人选择采用的模式。它对您正在做的事情没有任何好处,但确实提供了一个存储 "private class variables" 的范围,该范围由所有实例共享,但外界无法访问。你展示它的方式,它不是我最喜欢的,因为对象上没有类型信息。它只是一个具有属性的普通对象。在某些情况下(特别是在调试中,但有时在编码中),了解您拥有的对象类型会很有用。