Skip to content

说说下面代码的输出是什么?

Posted on:2024年7月19日 at 10:31
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 中又重新定义了一个同名属性,导致静态方法被覆盖了,所以此时输出的是在构造函数中定义的方法。

原文转自:https://fe.ecool.fun/topic/03e6d443-bac2-40be-847b-3276b05bae4e