function Foo(){ Foo.a = function(){ console.log(1); } this.a = function(){ console.log(2) } } Foo.prototype.a = function(){ console.log(3); } Foo.a = function(){ console.log(4); } Foo.a(); let obj = new Foo(); obj.a(); Foo.a();

参考答案

运行以上代码,输出结果为:

4
2
1

解析如下:

  1. 首先,调用 Foo.a() 方法,输出 4。这是因为 Foo.a 是一个静态方法,直接在函数对象上定义的,所以可以通过函数名直接调用执行。

  2. 然后,创建一个 Foo 类型的实例 obj,调用 obj.a() 方法,输出 2。这是因为在构造函数 Foo 中,使用 this.a 定义了实例属性 a,会覆盖原型中的同名属性。

  3. 最后,再次调用 Foo.a() 方法,输出 1。虽然在上面已经定义了一个静态方法 Foo.a,但是在构造函数 Foo 中又重新定义了一个同名属性,导致静态方法被覆盖了,所以此时输出的是在构造函数中定义的方法。