JavaScript中的构造函数
是否存在JavaScript中不是构造函数的函数。即,以下行将导致类型错误:JavaScript中的构造函数,javascript,constructor,Javascript,Constructor,是否存在JavaScript中不是构造函数的函数。即,以下行将导致类型错误: var a= new foo(); //foo is not a constructor 换句话说,我想知道以下几点: 是否存在没有内部属性的函数?是的,存在: > new window.open() TypeError: window.open is not a constructor > new parseInt(123) TypeError: parseInt is not a construct
var a= new foo(); //foo is not a constructor
换句话说,我想知道以下几点:
是否存在没有内部属性的函数?是的,存在:
> new window.open()
TypeError: window.open is not a constructor
> new parseInt(123)
TypeError: parseInt is not a constructor
其他一些内置函数可能会给出相同的结果。从技术上讲,这不是编写没有构造函数的函数,而是一种类似的效果:
实际上,这只是一些人用来做完全相反的事情的老把戏:强制将函数作为构造函数调用。因此,以上只是颠倒了这个原则。是的,内置函数可能不实现[[Construct]]属性。ES5规范在以下章节中明确说明: 除非在特定函数的描述中另有规定,否则本条中描述的非构造函数的内置函数均不得实现[[Construct]]内部方法。除非在特定功能的说明中另有规定,否则本条中描述的任何内置功能均不得具有原型属性 乍一看,后面列出的任何函数似乎都不是这样的 正如Quentin所演示的,许多宿主对象似乎也实现了没有[[Construct]]属性的函数。如果你想达到同样的效果,你必须接受Ingo Bürk提供的解决方案,因为无法控制是否在任何函数对象上设置了内部[[Construct]]属性。规范中涉及的部分包括以下步骤,该步骤不是可选的,不包含任何条件: 七,。设置F的[[Construct]]内部属性
我不确定你怎么会从那一行中得到错误,那么你的
foo
函数的语法是什么?除非foo
是一个对象,否则我们可以编写一个不是构造函数的函数吗?+1:不确定为什么是-1,我认为这是正确的。OP要求任何不带构造函数的函数——这就是了。
function Foo() {
if( this instanceof Foo ) {
throw new TypeError( "Foo is not a constructor" );
}
console.log( "I was called as a function" );
}
var foo = new Foo(); // TypeError: Foo is not a constructor
Foo(); // I was called as a function