有没有一种方法可以让JavaScript函数知道它是正常调用的;新的”;

Is there a way for a JavaScript function to know whether it was called normally or in conjunction with "new"?

本文关键字:常调用 新的 调用 函数 方法 一种 有没有 JavaScript      更新时间:2024-01-27

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

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

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

这能做到吗?如果是,如何?

无法绝对确定函数是如何调用的,但使用this instanceof MyClass可以非常确定,如下所示:

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

不过也有一些边缘情况,例如,我可以创建一个MyClass的新实例,然后执行MyClass.call(new MyClass)——这将创建一个假阳性,因为外部MyClass不是用new调用的。

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

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

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