有没有办法让JavaScript函数知道它是正常调用还是与“new”一起调用?

时间:2012-07-24 21:24:55

标签: javascript

  

可能重复:
  How to detect if a function is called as constructor?

我想在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)就足够了(但前者也不会错)。

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

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

3 个答案:

答案 0 :(得分:5)

无法完全确定函数的调用方式,但您可以非常肯定使用this instanceof MyClass,如下所示:

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

但是有边缘情况,例如我可以创建一个新的MyClass实例,然后执行MyClass.call(new MyClass) - 这会产生误报,因为外部MyClass未使用new调用。

答案 1 :(得分:1)

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

function MyClass(args) {
    var isInstance = this instanceof MyClass;
    // ...
}

答案 2 :(得分:1)

if(this instanceof MyClass)

可能就是你要找的东西。它可能会被.call.apply所欺骗,但无论如何,如果传递了一个实例,那么构造对象应该没有任何问题。