我想了解javascript中构造函数的内部工作。
所以这就是我面临的
让我们假设一个A类
class A {
constructor(){}
}
现在在控制台中运行命令
A.constructor('alert("Hi")')
此命令将打印
ƒ anonymous() {
alert("Hi")
}
为什么它没有显示完整的初始化或我缺少什么?
这导致警报在我们运行时执行
A.constructor('alert("Hi")')()
尽管运行此
A.constructor()('alert("Hi")')
不执行警报。
我完全困惑,因此想知道构造函数如何解释事物。
答案 0 :(得分:2)
A.constructor('alert("Hi")')
由于A
是一个类(=函数),所以A.constructor
是内置的Function
构造函数,并且此代码与
Function('alert("Hi")')
或
function () { alert("Hi") }
,即具有主体alert("Hi")
的匿名函数。控制台将准确显示该内容。
A.constructor('alert("Hi")')()
与
相同Function('alert("Hi")')()
或
( function() { alert("Hi") } ) ()
,即正在调用新创建的函数并显示警报。
A.constructor()('alert("Hi")')
A.constructor
是Function
,而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 部分。
希望它可以澄清混乱之处。