为什么javascript构造函数会打印传递给它的参数?

时间:2018-12-07 10:06:02

标签: javascript ecmascript-6

我想了解javascript中构造函数的内部工作。
所以这就是我面临的 让我们假设一个A类

class A {
constructor(){}
}

现在在控制台中运行命令

A.constructor('alert("Hi")')

此命令将打印

ƒ anonymous() {
 alert("Hi")
 }

为什么它没有显示完整的初始化或我缺少什么?

这导致警报在我们运行时执行

A.constructor('alert("Hi")')()

尽管运行此

A.constructor()('alert("Hi")')

不执行警报。

我完全困惑,因此想知道构造函数如何解释事物。

2 个答案:

答案 0 :(得分:2)

1。

A.constructor('alert("Hi")')

由于A是一个类(=函数),所以A.constructor是内置的Function构造函数,并且此代码与

相同
Function('alert("Hi")')

function () { alert("Hi") }

,即具有主体alert("Hi")的匿名函数。控制台将准确显示该内容。

2。

A.constructor('alert("Hi")')()

相同
Function('alert("Hi")')()

( function() { alert("Hi") } ) ()

,即正在调用新创建的函数并显示警报。

3。

 A.constructor()('alert("Hi")')

A.constructorFunction,而Function()创建了一个没有主体的匿名函数,因此我们有:

 ( function() {} ) ('alert("Hi")')

正在使用参数alert("Hi")调用该函数,但是由于该函数没有主体,因此什么也没发生。

答案 1 :(得分:2)

在编写A.constructor()时,实际上并没有调用在类A中定义的类A的构造函数,而是在访问A的Object.prototype.constructor。Object.prototype.constructor做什么?它返回对用于创建A的构造函数的引用。

由于A是一个类,而类是javascript中的函数,因此A.constructor返回对Function的引用,即A.constructor等效于Function

由于javascript中的Function("alert('hi')")等效于ƒ anonymous( ) { alert('hi') },因此A.construtor("alert('hi')")等效于ƒ anonymous( ) { alert('hi') }

因此,这意味着A.construtor("alert('hi')")返回了对函数的引用,即ƒ anonymous( ) { alert('hi') },从而回答了问题的 1st 部分。

现在如何在javascript中调用函数?您可以在函数引用后使用括号。当A.constructor("alert('hi')")返回函数引用时,您可以使用执行警报的A.constructor("alert('hi')")()调用该函数。回答了您问题的第二部分。

在第三部分,即A.constructor()('alert("Hi")')中,首先,A.constructor()返回ƒ anonymous( ) {},如果它是('alert("Hi")',则您将其称为在前面加上括号,但是此函数为空,调用时什么也没发生。这样就可以回答问题的第3 部分。

希望它可以澄清混乱之处。