JavaScript 对象实例化选项

Ben*_*Ben 5 javascript

鉴于:

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

var MyCtor = function() {}
var myInstance = new MyCtor(); //myInstance.constructor ==== Function
Run Code Online (Sandbox Code Playgroud)

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

这些方法中的一种是首选吗?在某些情况下,一个人更惯用吗?

Sir*_*rko 4

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

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

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

var MyCtor = function MyCtor() {}
var myInstance = new MyCtor(); //myInstance.constructor === MyCtor
Run Code Online (Sandbox Code Playgroud)

这也有效:

var otherRefName = function MyCtor() {}
var myInstance = new otherRefName(); //myInstance.constructor === MyCtor
Run Code Online (Sandbox Code Playgroud)

关于用法:

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

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

getConstructor( type ) {

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

}


var myConstr = getConstructor( 'a' ),
    myInstance = new myContr(); // myInstance.constructor === ConstrA
Run Code Online (Sandbox Code Playgroud)

其他相关问题:

  • 明白了,但是什么时候会使用它们呢?是否有惯用的使用模式。在查看内存中的对象时,拥有构造函数属性似乎很有用,有助于调试。 (2认同)