javascript - 在 Javascript 中创建对象的方式有何不同?

标签 javascript constructor object-literal

经过一些研究,我发现了四种可以在 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(){

    }
}

除了评论中的问题,每一个应该在什么情况下使用?使用其中一个时是否存在明显的性能差异?

最佳答案

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

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

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

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

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()

关于javascript - 在 Javascript 中创建对象的方式有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59063270/

相关文章:

php - 如何在构造函数中调用实体管理器?

jQuery 创建对象文字循环

javascript - 对象文字类型的调用签名是什么?它们如何与泛型类型一起使用?

javascript - Google Closure Compiler 将类型从 EventTarget 强制转换为 Node

javascript - fullpage.js 背景图片不覆盖

javascript - 如何通过 ES6 导入包含 Foundation 6 JS 文件?

java - 静态工厂相对于构造函数的劣势

Java:Spring Boot 类构造函数有太多 DI?

javascript - 如何正确绑定(bind)到 AngularJS 中的服务属性?

javascript - IIFE 与范围大括号