有没有一种方法可以让JavaScript函数知道它是正常调用的;新的”;
Is there a way for a JavaScript function to know whether it was called normally or in conjunction with "new"?
可能重复:
如何检测函数是否被调用为构造函数?
我希望在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
欺骗,但无论如何,如果传递了一个实例,那么构造对象应该不会有任何问题。
相关文章:
- 在新的浏览器选项卡上加载新的aspx页面后调用JavaScript函数
- 调用JavaScript”;新的“;来自CoffeeScript
- 从Backbone中的另一个视图调用新视图
- Firefox弹出窗口“;这个网页被重定向到一个新的位置“;在每个requestPromise ajax调用上,有什么方
- 有没有一种方法可以让JavaScript函数知道它是正常调用的;新的”;
- angular.injector在每次调用时返回新的服务实例
- 正在加载新的Javascript,但正在调用旧的Javascript.MVC
- ajax 调用返回时可以向页面添加新的 javascript 函数吗?
- 如何使用jQuery添加输入字段并将Ajax调用到新的输入字段中
- 为什么在这里再次调用新是有效的
- 在 POST ajax 处理程序中更改 window.location 会发出新的 ajax 调用,而不是重定向
- JavaScript游戏 - 如何自动调用对象的新实例
- 有没有一种方法可以调用某些服务器端代码;新的“;按钮被按下
- 如何在不调用onclick的情况下打开新窗口上的链接
- 每个函数调用上都有一个新的弹出窗口
- dc传单js如何使用新ajax调用中的数据更新clopeth
- 当调用ajax POST/GET时,我可以使用一个函数来创建新的php页面吗
- 在新的多进程Firefox中从网页调用插件
- 我可以调用一个不再存在的JS函数,但我可以'在我看来,没有调用新的JS函数
- 停止Ajax请求并调用新的Ajax