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

时间:2014-11-02 12:23:21

标签: javascript constructor function-pointers factory

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

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控制台提供错误TypeError: cFunc is not a constructor。什么是正确的方法?

此外,我必须能够"比较"构造函数,即我需要知道两个引用是否指向同一个构造函数。 (在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 */

这可能吗?

2 个答案:

答案 0 :(得分:4)

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

var wrapper = new Wrapper( A.constructor );

var wrapper = new Wrapper( A );

您可以使用

测试结果
console.log(obj instanceof A);

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

答案 1 :(得分:0)

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

因此,A.constructor应更改为A

但是,函数确实有原型,并且原型的constructor属性引用它们。因此,A.prototype.constructor也会起作用,但引用A是一种相当奇怪的方式。

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

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