我想在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)
就足够了(但前者也不会错)。
只是可能用途的一个例子。
可以这样做吗?如果是这样,怎么样?
答案 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
所欺骗,但无论如何,如果传递了一个实例,那么构造对象应该没有任何问题。