【发布时间】:2013-04-20 22:04:13
【问题描述】:
上下文
我注意到某些函数只能使用new 前缀调用。在没有它的情况下调用时,会抛出错误 Illegal Invocation。以下是在以不同方式调用 Image 时控制台如何反应的两个示例。
-> new Image();
<- <img>
-> Image();
<- TypeError: DOM object constructor cannot be called as a function.
更有趣的是,仔细观察后,这些类型的函数看起来像函数,但实际上并非如此。以Image 为例,typeof 命令显示Image 是一个函数,而Image 的构造函数则暗示它是一个对象。
这与下面的大多数构造函数非常不同。
function Foo(){
this.identity = 'Bar';
}
函数Foo有两种调用方式,new Foo()和Foo()。这与Image 函数非常不同。
问题
Image 函数的这个动作与大多数构造函数有很大不同。这怎么可能?这就是new 前缀必须与Image 一起使用的原因吗?更重要的是,这种功能可以重新创建吗?
【问题讨论】:
-
我没有仔细研究过这个问题,也没有解决我的问题。我在问为什么有些构造函数需要新的前缀,而另一些则无所谓。有什么不同,我该如何重新创建它?
-
简单,检查
this是否是MyObj和function MyObj() { if(!(this instanceof MyObj)) throw new TypeError("MyObj must be called as a constructor") } -
@apsillers:您可以通过以下方式通用(以防函数名称更改):
if (!(this instanceof arguments.callee)) throw new Error("Constructor called as a function");请参阅here。
标签: javascript function object constructor