我需要将对类的构造函数的引用存储在变量中,然后再构造该对象。这是我的最小代码示例:
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 */
这可能吗?
答案 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
优于比较构造函数的优点是将考虑继承层次结构。