Javascript:在变量中作为引用传递构造函数并调用此构造函数

Javascript:在变量中作为引用传递构造函数并调用此构造函数,javascript,constructor,function-pointers,factory,Javascript,Constructor,Function Pointers,Factory,我需要将对类的构造函数的引用存储在变量中,然后再构造对象。这是我的最小代码示例: function A() { var _foo = "A"; } function Wrapper( constructorFunc ) { var _constructorFunc = constructorFunc; this.constructorFunc = function() { return _constructorFunc; } } var wrapper = new

我需要将对类的构造函数的引用存储在变量中,然后再构造对象。这是我的最小代码示例:

function A() {
  var _foo = "A";
}

function Wrapper( constructorFunc  ) {
  var _constructorFunc = constructorFunc;

  this.constructorFunc = function() {
    return _constructorFunc;
  }
}

var wrapper = new Wrapper( A.constructor );
var cFunc = wrapper.constructorFunc();
var obj = new cFunc(); /* obj should be an A now */
我希望清楚我想做什么。Firebug控制台给出错误
类型错误:cFunc不是构造函数
。正确的方法是什么

此外,我必须能够“比较”构造函数,也就是说,我需要知道两个引用是否指向同一个构造函数。(在C++中,这是可能的,因为比较函数的地址。)作为例子:

function A() {
  var _foo = "A";
}

function B() {
  var _bar = "B";
}

function Wrapper( constructorFunc  ) {
  var _constructorFunc = constructorFunc;

  this.constructorFunc = function() {
    return _constructorFunc;
  }
}

var wrapper1 = new Wrapper( A.constructor );
var wrapper2 = new Wrapper( A.constructor );
var wrapper3 = new Wrapper( B.constructor );

wrapper1.constructorFunc() == wrapper2.constructorFunc() /* should evaluate to true */
wrapper1.constructorFunc() == wrapper3.constructorFunc() /* should evaluate to false */

这可能吗?

构造函数是
A
,因此必须更改

var wrapper = new Wrapper( A.constructor );

您可以使用

console.log(obj instanceof A);

关于你的第二个问题:没有任何东西阻止你比较构造函数(或任何函数):当两个函数相同时,它们是相等的。

构造函数是
A
,所以你必须改变

var wrapper = new Wrapper( A.constructor );

您可以使用

console.log(obj instanceof A);

关于你的第二个问题:没有什么可以阻止你比较构造函数(或任何函数):当两个函数相同时,它们是相等的。

在JavaScript中,任何函数都可以是构造函数,但函数没有
构造函数
属性

因此,
A.constructor
应该更改为just
A

但是,函数确实有原型,它们的原型的
构造函数
属性会引用它们。因此,
A.prototype.constructor
也可以工作,但引用
A
是一种更为复杂的方式

如果您的
包装器
只封装了一个构造函数以在以后返回它,那么您似乎引入了一个不必要的对象。只需直接传递构造函数


最后,您可以使用
instanceof
操作符来了解对象是否是特定构造函数的实例。
instanceof
与将构造函数一起比较的优点是,将考虑继承层次结构。

在JavaScript中,任何函数都可以是构造函数,但函数没有
构造函数
属性

因此,
A.constructor
应该更改为just
A

但是,函数确实有原型,它们的原型的
构造函数
属性会引用它们。因此,
A.prototype.constructor
也可以工作,但引用
A
是一种更为复杂的方式

如果您的
包装器
只封装了一个构造函数以在以后返回它,那么您似乎引入了一个不必要的对象。只需直接传递构造函数


最后,您可以使用
instanceof
操作符来了解对象是否是特定构造函数的实例。
instanceof
与将构造函数一起比较的优点是将考虑继承层次结构。

注意:您不需要
\u constructorFunc
变量,因为
constructorFunc
函数参数仍然可以在同一个闭包中访问。如前所述;构造函数是原型的一个属性,您不需要做任何事情就可以得到它。通过继承,您通常会破坏此属性。下面的答案可能会有帮助:@nnnnnn,@HMR:我真的很喜欢这里的社区,因为人们通常会在很短的时间内得到一个好的答案。见下面dystroy的答案。它简明扼要。但我想知道为什么人们开始评论代码中无关紧要的缺陷,如果它明确指出代码应该作为一个最小的例子。例如,请参见下面由plalx给出的另一个答案的讨论。我相信很明显,在我的真实代码中,我既没有类
a
B
,也没有称为
\u foo
\u bar
的属性。因此,任何关于“有意义”的讨论都是浪费。注意:您不需要
\u constructorFunc
变量,因为
constructorFunc
函数参数仍然可以在同一个闭包中访问。如前所述;构造函数是原型的一个属性,您不需要做任何事情就可以得到它。通过继承,您通常会破坏此属性。下面的答案可能会有帮助:@nnnnnn,@HMR:我真的很喜欢这里的社区,因为人们通常会在很短的时间内得到一个好的答案。见下面dystroy的答案。它简明扼要。但我想知道为什么人们开始评论代码中无关紧要的缺陷,如果它明确指出代码应该作为一个最小的例子。例如,请参见下面由plalx给出的另一个答案的讨论。我相信很明显,在我的真实代码中,我既没有类
a
B
,也没有称为
\u foo
\u bar
的属性。当然,我的
Wrapper
要多得多,而且在我的真实代码中,它甚至不被称为
Wrapper
。这是一个最小的示例。@user2690527很好!顺便说一句,您应该在原型上定义函数,例如
constructorFunc
。它的内存效率更高。将函数直接附加到实例通常被认为是一种糟糕的做法,除非有很好的理由这样做。据我所知,JavaScript是不起作用的。如果将
constructorFunc
附加到实例,则它是一个“priviledge”方法。这意味着它可以公开访问,并且可以访问私有属性,如
\u constructorFunc
。这就是我所需要的,在其他编程语言中被称为“公共方法”。如果我在原型上定义函数,即
Wrapper.prototype.constructorFunc=function(){}
,它在JavaScript术语中称为“公共方法”,但这种函数不能访问私有属性。但是我需要它来返回
\u constru