1function Foo(){ 2 Foo.a = function(){ 3 console.log(1); 4 } 5 this.a = function(){ 6 console.log(2) 7 } 8} 9 10Foo.prototype.a = function(){ 11 console.log(3); 12} 13 14Foo.a = function(){ 15 console.log(4); 16} 17 18Foo.a(); 19let obj = new Foo(); 20obj.a(); 21Foo.a();
参考答案:
运行以上代码,输出结果为:
4
2
1
解析如下:
首先,调用 Foo.a() 方法,输出 4。这是因为 Foo.a 是一个静态方法,直接在函数对象上定义的,所以可以通过函数名直接调用执行。
然后,创建一个 Foo 类型的实例 obj,调用 obj.a() 方法,输出 2。这是因为在构造函数 Foo 中,使用 this.a 定义了实例属性 a,会覆盖原型中的同名属性。
最后,再次调用 Foo.a() 方法,输出 1。虽然在上面已经定义了一个静态方法 Foo.a,但是在构造函数 Foo 中又重新定义了一个同名属性,导致静态方法被覆盖了,所以此时输出的是在构造函数中定义的方法。
最近更新时间:2024-07-19