0

我试图理解 javascript 中的对象创建,并且我知道我们有几种方法可以完成它:Object Literal、Factory 和 Constructor。

/***********************************************/
/***********************************************/
// Literal - Singleton
const obj_lit = {
  log_lit: function() {
    //console.log("Obj Literal");
    document.write("Obj Literal<br>");
  }
};
obj_lit.log_lit();
/***********************************************/
/***********************************************/
// Factory - Explicit Return
function objFac() {
  return {
    log_fac: function() {
      //console.log("Obj Factory");
      document.write("Obj Factory<br>");
    }
  };
}
const obj_fac = objFac();
obj_fac.log_fac();
/***********************************************/
/***********************************************/
// Constructors - Implicit Return
function ObjCon() {
  this.log_con = function() {
    //console.log("Obj Constructor");
    document.write("Obj Factory<br>");
  }
}
const obj_con = new ObjCon();
obj_con.log_con();

我实际上正在使用控制台,但在 jsfiddle 我通过 doc write 输出

问题是 obj 文字和工厂与我们明确使用 obj 构造函数类型的方式相比,我们没有通过构造函数。到目前为止一切顺利,但是当我在控制台中检查 obj 文字和工厂时,它们确实有一个构造函数 [本机代码]

这是我在控制台中得到的:

obj_lit.constructor
ƒ Object() { [native code] }

obj_fac.constructor
ƒ Object() { [native code] }

obj_con.constructor
ƒ ObjCon() {
  this.log_con = function() {
    console.log("Obj Constructor");
  }
}

那么 obj_lit 和 obj_fac 的这 2 个本地构造函数到底是什么?

并且 js 引擎实际上是通过内部的“新”关键字创建 obj_lit 和 obj_fac 吗?

当我们不想采用通过构造函数创建对象的经典方式时,它不会破坏使用文字和工厂的整个概念吗?

4

1 回答 1

0

那么 obj_lit 和 obj_fac 的这 2 个本地构造函数到底是什么?

{}相当于new Object

并且 js 引擎实际上是通过内部的“新”关键字创建 obj_lit 和 obj_fac 吗?

或多或少。这是一个实现细节。

当我们不想采用通过构造函数创建对象的经典方式时,它不会破坏使用文字和工厂的整个概念吗?

不。

原型继承是 JavaScript 的一个基本特性。

如果您开始修改对象原型,它只会破坏事情。如果您不想使用 JS 的 OO 特性,那么您就不会这样做。

于 2019-08-06T08:55:53.707 回答