Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的构造函数_Javascript_Constructor - Fatal编程技术网

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

是否存在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 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