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

Tom*_*Tom 2 javascript

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

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

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

  // instance initialization stuff here...

}
Run Code Online (Sandbox Code Playgroud)

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

只是可能使用的一个例子.

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

Jam*_*mes 5

没有办法绝对确定函数是如何被调用的,但你可以非常肯定地使用它this instanceof MyClass,如下所示:

if (this instanceof MyClass) {
    // Was called with `new`
} else {
    // Was called as regular function
}
Run Code Online (Sandbox Code Playgroud)

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