2

可能重复:
如何检测函数是否被称为构造函数?

我想在 JavaScript 中有一个函数,如果它被正常调用或被调用以创建一个新实例,它的行为会有所不同。可能有许多不同的用途,其中两个功能可以相关或不相关。new当函数总是用于创建新实例时,一种用途是使编码器不必键入:

function MyClass(arg1, arg2) {
  if(/* not called with "new" */) return new MyClass(arg1, arg2);

  // instance initialization stuff here...

}

这样我就不必打字了var x = new MyClass(arg1, arg2):打字就足够了var x = MyClass(arg1, arg2)(但前者也不会错)。

只是可能用途的一个例子。

这可以做到吗?如果是这样,怎么做?

4

3 回答 3

5

没有办法绝对确定函数是如何被调用的,但你可以很确定 using this instanceof MyClass,如下所示:

if (this instanceof MyClass) {
    // Was called with `new`
} else {
    // Was called as regular function
}

但是有一些边缘情况,例如我可以创建一个 MyClass 的新实例,然后这样做MyClass.call(new MyClass)——这会产生误报,因为外部MyClass没有被调用new

于 2012-07-24T21:30:08.927 回答
1

我能想到的唯一选择是测试this. 你可以试试:

function MyClass(args) {
    var isInstance = this instanceof MyClass;
    // ...
}
于 2012-07-24T21:29:46.507 回答
1
if(this instanceof MyClass)

可能是您正在寻找的。它可以被.calland愚弄.apply,但是如果传递了一个实例,构造对象应该没有任何问题,无论如何。

于 2012-07-24T21:29:56.773 回答