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

Javascript: Passing constructor as reference in a variable and calling this constructor

本文关键字:构造函数 引用 调用 变量 Javascript      更新时间:2023-09-26

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

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 */

这可能吗?

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

var wrapper = new Wrapper( A.constructor );

var wrapper = new Wrapper( A );

你可以用测试结果

console.log(obj instanceof A);

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

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

因此,应将A.constructor更改为仅A

然而,函数确实有原型,并且它们的原型的constructor属性引用回它们。因此,A.prototype.constructor也会起作用,但引用A的方式会更简单。

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

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