假设:
function MyCtor() {}
var myInstance = new MyCtor(); //myInstance.constructor ==== MyCtor
var MyCtor = function() {}
var myInstance = new MyCtor(); //myInstance.constructor ==== Function
如果使用前一种模式实例化一个对象,那么构造函数就会更有意义"。
这些方法中的一种是首选吗?是否存在一个更惯用的情况?
答案 0 :(得分:4)
在第一种情况下,当你对构造函数进行字符串化时,你有一个命名函数,因此可以看到该名称。
在第二种情况下,您只有一个指向匿名函数的指针,因此不能为构造函数显示任何名称。
但是,您可以通过对第二种情况使用命名函数来组合两者:
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
其他相关问题:
答案 1 :(得分:0)
作为@ sirko的答案的补充(并且有点偏离),我将添加提升POV:
var myInstance = new MyCtor();
function MyCtor() {}
alert(myInstance.constructor ) //MyCtor
,而
var myInstance = new MyCtor(); //error
var MyCtor = function() {}
alert(myInstance.constructor )