3

我需要一个不应作为函数调用的构造函数:

function Foo() {
  ...
};

var f = new Foo(); // ok
Foo();  // throws error

在这里搜索,发现也许我可以使用以下来检查它是否被称为函数

if (!(this instanceof arguments.callee))

如果是这样,那么我应该抛出什么错误?

而且,有没有更好的方法来定义构造函数?

4

3 回答 3

2

arguments.callee(不幸的是,恕我直言)在 ES5 严格模式下已弃用。

如果调用者忘记使用,我建议您实例化对象,而不是抛出错误new

function Foo() {
    if (!(this instanceof Foo)) {
         return new Foo();
    }

    ...
};
于 2013-09-10T10:42:30.870 回答
1
if (!(this instanceof arguments.callee))

arguments.callee已弃用。只需使用正确的参考:this instanceof Foo.

如果是这样,那么我应该抛出什么错误?

只是一个表明原因的正常错误:

throw new Error("Foo must be called as a constructor");

顺便说一句,您不妨容忍它并创建一个新实例:return new Foo().

于 2013-09-10T10:42:11.023 回答
0

这个怎么样:

/*WARNING CALL THIS ONLY AS A CONSTRUCTOR, NOT AS A FUNCTION*/
于 2013-09-10T21:51:22.290 回答