您使用构造函数创建的对象本身可以是一个函数吗?

时间:2011-02-28 18:26:56

标签: javascript

我希望这个问题有道理。我可以做以下事情:

function constructor_function() {...code...};

var a = new constructor_function();

a();

3 个答案:

答案 0 :(得分:3)

如果构造函数返回一个对象,那么它将是new ..表达式的值。函数是一个对象,所以你可以做你想做的事:

function ConstructorFunction() {
    return function () { alert("A function!"); };
}

var a = new ConstructorFunction();

a();

答案 1 :(得分:1)

function Wrapper(constr, func) {
    return function() {
        var f = func();
        constr.apply(f, arguments);
        return f;
    }
}

function ConstructorFunction() {
    return function() {
        console.log("A function");
    }
}

function Constructor() {
    this.foo = 42;
}

var MyFunction = Wrapper(Constructor, ConstructorFunction);
var o = MyFunction();
o(); // A function
console.log(o.foo); // 42

要同时操纵this状态并且返回的对象是function,如果没有很多额外的箍就很难完成。

这简直就是我能做到的。您有标准的构造函数,它将this作为对象进行操作。然后你有你的ConstructorFunction,这是你想要构造函数返回的函数。这必须是每次调用时返回新函数的因素。

将两者结合在一起得到一个函数,该函数返回一个具有返回函数和状态操作的对象。

Live example

答案 2 :(得分:0)

您可以从构造函数返回一个函数,但它实际上并不是构造函数。您可以将该函数用作常规函数,不需要new关键字:

function constructor_function() {
  return function() { alert(42); }
};

var a = constructor_function();

a();

由于函数是一个对象,您甚至可以向其添加属性:

function constructor_function() {
  var t = function() { alert(42); }
  t.size = 1337;
  return t;
};

var a = constructor_function();

a();
alert(a.size);