JavaScript对象实例化选项

JavaScript object instantiation options

鉴于:

1
2
3
4
5
function MyCtor() {}
var myInstance = new MyCtor(); //myInstance.constructor ==== MyCtor

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

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

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


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

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

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

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

这也适用于:

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

关于用法:

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

一个(非常)简单的例子可以是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
getConstructor( type ) {

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

}


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

其他相关问题:

  • var functionname=function()vs function functionname()


作为对@sirko答案的补充(还有一点),我将添加提升POV:

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

虽然

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