说说下面代码的输出是什么?
js
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 中又重新定义了一个同名属性,导致静态方法被覆盖了,所以此时输出的是在构造函数中定义的方法。