Javascript中(函数(全局){}(this)、构造函数和类之间的区别是什么?

Javascript中(函数(全局){}(this)、构造函数和类之间的区别是什么?,javascript,oop,Javascript,Oop,我目前知道如何创建类和对象有三种方法 方法1(这件可怕的事情): 方法2(ES6类): 方法3(构造函数函数): 这三种方法之间的区别是什么?哪种方法最有效/最实用?尤其是第一种方法?方法1不是类,也不是对象,而是一个模块-此方法允许您将一些代码封装在函数中,并在当前执行环境中立即执行。因为您是pas在调用它时,在this中歌唱,无论当前的作用域是它的上下文(例如,可以从类声明中调用它作为一种mixin) 正如您在问题中提到的,方法2在ES6中是新出现的。一些开发人员对此表示不满,因为它会导致混

我目前知道如何创建类和对象有三种方法

方法1(这件可怕的事情):

方法2(ES6类):

方法3(构造函数函数):


这三种方法之间的区别是什么?哪种方法最有效/最实用?尤其是第一种方法?

方法1不是类,也不是对象,而是一个模块-此方法允许您将一些代码封装在函数中,并在当前执行环境中立即执行。因为您是pas在调用它时,在
this
中歌唱,无论当前的作用域是它的上下文(例如,可以从类声明中调用它作为一种mixin)

正如您在问题中提到的,方法2在ES6中是新出现的。一些开发人员对此表示不满,因为它会导致混乱。请参见此处的示例:。这种方法的基本优点是它为我们提供了一些语法糖分,而缺点是它使JavaScript看起来像是实际有类,而实际上没有(正如您在问题本身中所提到的,它依赖于继承的原型)


方法3是“经典”创建对象的方法。依靠JavaScript作用域、闭包和上下文的工作方式,我们得到了一个可以像调用类构造函数一样调用的函数,它确实很好地逼近了这一点。就个人而言,这仍然是我首选的方法-这三种方法在效率上没有真正的区别列出,但此方法是最古老的,因此也是最广泛和可读的方法。因此,它得到了我的投票。

第一个方法不是生成类,而是生成模块。这个问题太广泛,太固执己见,不适合StackOverflow。不过,对于代码复查堆栈交换来说,这可能是一个好问题。如果你有高度集中、具体的问题,这些都是很好的。那么模块的用途是什么呢?模块在几个方面都很有用:它们创建了一个“私有的”适用于某些变量,只公开一个确保正确处理这些变量的API,并且我们也避免了可能的命名冲突。模块和类密切相关,但在需要实际对象来表示某个对象的情况下(尤其是需要多个对象的情况下),您应该更喜欢类。当您提供功能集并希望隐藏部分实现时,模块会更有用。
;(function(global) {
  let module = global.player1 = {};
  module.x = 0;
  module.y = 0;
  module.tick = function() { /* Do stuff */ }
  module.show = function(g) {
    g.fillRect(module.x, module.y, 16, 16);
  }
})(this);
class CPlayer {
  constructor() {
    this.x = 16;
    this.y = 0;
  }
}
CPlayer.prototype.tick = function() { /* Do stuff */ }
CPlayer.prototype.show = function(g) {
    g.fillRect(this.x, this.y, 16, 16);  
}
let player2 = new CPlayer();
function FPlayer() {
  this.x = 32;
  this.y = 0;
}
FPlayer.prototype.tick = function() { /* Do stuff */ }
FPlayer.prototype.show = function(g) {
  g.fillRect(this.x, this.y, 16, 16);  
}
let player3 = new FPlayer();