在 Javascript 中制作对象的方式有何不同?

What are the differences in ways to make an object in Javascript?

经过一些研究,我发现了四种初始化对象的方法 Javascript:

1.

var Game = { // I guess everything here is made public?
    canvas : document.createElement("canvas"),

    render : function(){

    }
}

2.

var Game  = function(){ //if this function isn't a self invoking one, how should it be called?
    var canvas = document.createElement("canvas");

    return {
    render : function(){ // why this does not work when being called? says it's undefined
        alert("a");
    }
  }
}

3.

var Game  = (function(){
    var canvas = document.createElement("canvas");

    function init_properties(){ // why is this not called?
        alert("test");
    }

    return {
    // whatever you want to be made public

    render : function(){
        alert(canvas);
    }
    }
}) ()

4.

function Game(){
    var privateVar = 10;
    this.publicVar = 20;

    this.render = function(){

    }
}

除了评论中的问题,每一个应该在什么情况下使用?使用一个比另一个有明显的性能差异吗?

你的第一个和第三个方法return对象,你的第二个和第四个方法是实例化函数。第三个与第二个相同,但会立即调用以解析为对象。这称为立即调用函数表达式 (IIFE)。它用于创建可供 returned 对象的方法访问的私有变量,而无需单独定义初始化函数。确实没有实际理由这样做。

在 JavaScript 中实例化对象有两种方法:直接和通过初始化函数。

当您不需要跟踪与对象关联的私有变量时,您想使用直接实例化。如果确实需要私有变量,请通过调用对象的初始化函数 return 来实例化对象。

直接(你的第一种方法):

const Game = {
    canvas : document.createElement("canvas"),
    render : () => alert('a')
}

通过初始化函数(你的第二种和第四种方法):

const initGame = () => {
    const privateCounter = 0
    const canvas = document.createElement("canvas")
    return {
      render: () => alert('a')
    }
}

const Game = initGame()