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 ) |