【问题标题】:JavaScript object instantiation optionsJavaScript 对象实例化选项
【发布时间】:2023-03-15 09:50:01
【问题描述】:

给定:

function MyCtor() {}
var myInstance = new MyCtor(); //myInstance.constructor ==== MyCtor

var MyCtor = function() {}
var myInstance = new MyCtor(); //myInstance.constructor ==== Function

如果您使用前一种模式实例化一个对象,则构造函数“更有意义”。

是否首选这些方法之一?有没有更惯用的情况?

【问题讨论】:

  • 除了在某些实现中存在非标准名称属性外,这些函数的行为相同。使用您喜欢的任何方法。真的没关系。
  • ...除了提升之外,唯一的技术区别可能是第一个不应该在块语句中,因为它不是语句。
  • ...另外值得注意的是,StackOverflow 上有几十个问题非常详细地处理了这些问题之间的差异。

标签: javascript


【解决方案1】:

在第一种情况下,您有一个命名函数,因此当您对构造函数进行字符串化时会看到该名称。

在第二种情况下,您只有一个指向匿名函数的指针,因此无法为构造函数显示名称。

不过,对于第二种情况,您可以通过使用命名函数将两者结合起来:

var MyCtor = function MyCtor() {}
var myInstance = new MyCtor(); //myInstance.constructor === MyCtor

这也有效:

var otherRefName = function MyCtor() {}
var myInstance = new otherRefName(); //myInstance.constructor === MyCtor

关于用法:

当您需要将构造函数传递给其他函数(可能是回调)时,您可以使用此模式。

一个(非常非常)简化的例子可能是这样的:

getConstructor( type ) {

  switch( type ) {
    case 'a': return function ContrA(){};
    case 'b': return function ContrB(){};
  }

}


var myConstr = getConstructor( 'a' ),
    myInstance = new myContr(); // myInstance.constructor === ConstrA

其他相关问题:

【讨论】:

  • 明白了,但是你什么时候会使用它们呢?是否有惯用的使用模式。在查看内存中的对象时,具有构造函数属性似乎很有用,有助于调试。
  • @RoyiNamir 在工厂模式中不会返回一个新实例而不是构造函数吗?
  • @Sirko 有点。你返回函数,你稍后会在 new 上执行。所以我们可以争论new 是否丢失会导致不将其称为工厂。但一般的想法是,您提供一些关于您想要什么的信息,而其他东西会创建一些东西并将其返回给您。我们稍后会做 new ,所以我想它非常接近。更不用说如果没有function (){this.x=...},您将无法对new 无所事事.....:-)
  • 我不会说你有一个指向函数的“指针”,因为 JavaScript 没有指针。前两个示例与对象引用相同。并且应该注意,第二个示例中的 === 比较将失败,因为 MyCtor 在外部范围内不可用。不确定您是否暗示您实际上可以进行这种比较。
【解决方案2】:

作为对@sirko 回答的补充(有点偏离),我将添加吊装 POV:

var myInstance = new MyCtor();
function MyCtor() {}
alert(myInstance.constructor ) //MyCtor

同时

var myInstance = new MyCtor();  //error
var MyCtor = function() {}
alert(myInstance.constructor )

【讨论】:

    猜你喜欢
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多