关于static在javascript中的工作方式有些困惑。

function StaticExample() {}

StaticExample.staticProp = "Hello"

console.log(StaticExample.staticProp) // "Hello"


在这里,我创建了一个function,然后创建了一个静态变量staticProp(尽管我们可以称其为静态)。这会将字段staticProp添加到constructorStaticExampleprototype字段中

问题1:这种行为是否有特定原因(字段已添加到构造函数属性中)?

现在,constructor重写如下。

StaticExample.prototype.constructor = {}

console.log(StaticExample.staticProp) // "Hello"


即使在那之后,当我尝试访问StaticExample.staticProp时,它也会提供Hello的正确值

问题2:即使从最初添加staticProp的地方抄写了constructor的地方,也是如此。

最佳答案

StaticExample是一个对象。功能对象,但仍然是对象。
您为其分配一个新属性:StaticExample.staticProp = "Hello"

StaticExample也恰好具有属性prototype
属性StaticExample.prototype.constructor指向StaticExample

现在,您显然可以访问StaticExample.staticProp,因为它只是您分配的对象的属性。

您也可以将StaticExample.prototype.constructor的值替换为其他值。现在StaticExample.prototype.constructor不再指向StaticExample。但是StaticExample仍然是StaticExample,它仍然具有您在其上创建的属性staticProp。您没有以任何方式替换StaticExample对象。您所做的替换是StaticExample.prototype.constructor,它是不同对象的不同属性。

10-07 13:29