【问题标题】:OOP Javascript: Built in vs User defined ConstructorOOP Javascript:内置与用户定义的构造函数
【发布时间】:2019-08-06 08:47:52
【问题描述】:

我正在尝试理解 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 文字和工厂时,它们确实有一个构造函数 [native code]

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

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 引擎是否真的通过内部的“new”关键字创建了 obj_lit 和 obj_fac?

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

【问题讨论】:

  • 它们是Object类的构造函数。

标签: javascript oop constructor object-literal objectfactory


【解决方案1】:

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

{} 等价于new Object

js 引擎是否真的通过内部的“new”关键字创建了 obj_lit 和 obj_fac?

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

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

没有。

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

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

【讨论】:

  • 另一件有趣的事情(至少对我来说,考虑到我不太了解 oop)是对于 Obj Lit 我评论了 obj_lit.log_lit();当我在控制台中检查 obj_lit 时,它就在那里并且还活着。 Obj Factory 也是如此,但如果我评论: // const obj_con = new ObjCon();那么 obj_con 将在控制台中不可用或不被创建是否应该考虑这一事实以及决定使用哪种对象的参数之一? Fac、Lit 或 Con
  • obj_lit.log_lit(); 调用现有对象的方法。 const obj_con = new ObjCon(); 创建一个对象。它们并不等同。您需要注释掉 obj_lit = { ... } 以阻止它被创建。
猜你喜欢
  • 2015-10-23
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多