`ES6`为什么会输出这个结果,程序是怎么执行的,有大佬可以解释一下吗?

ES6为什么会输出这个结果,程序是怎么执行的,有大佬可以解释一下吗?

class Parent {
  static myMethod(msg) {
    console.log('static', msg);
  }

  myMethod(msg) {
    console.log('instance', msg);
  }
}

class Child extends Parent {
  static myMethod(msg) {
    super.myMethod(msg);
  }

  myMethod(msg) {
    super.myMethod(msg);
  }
}

Child.myMethod(1); // static 1

var child = new Child();
child.myMethod(2); // instance 2
阅读 2.1k
avatarAI BotBETA

这段 JavaScript 代码涉及到 ES6(ECMAScript 2015)中的类和继承,以及方法解析的动态绑定。下面我将解释为什么输出这个结果,以及程序是如何执行的。

首先,我们来看一下代码的结构:

  1. Parent 类有两个同名方法 myMethod,一个静态的(static),一个实例的(instance)。
  2. Child 类继承了 Parent 类,并重写了这两个方法。
  3. Child 类中,静态的 myMethod 调用父类的静态方法,实例的 myMethod 调用父类的实例方法。

接下来,我们分步解释程序的执行过程:

1. Child.myMethod(1);

  • 这里直接调用了 Child 类的静态方法 myMethod,参数为 1
  • Child 类中,静态方法 myMethod 调用了父类的静态方法 myMethod,即 super.myMethod(msg);
  • 因为 Parent 类的静态方法 myMethod 是直接定义的,所以它不依赖于任何实例或上下文,因此它会输出 'static', msg,即 'static' 1

2. var child = new Child();

  • 这里创建了一个新的 Child 类的实例,并赋值给变量 child

3. child.myMethod(2);

  • 这里调用了新创建的 child 实例的 myMethod 方法,参数为 2
  • Child 类中,实例方法 myMethod 调用了父类的实例方法 myMethod,即 super.myMethod(msg);
  • 在执行这个调用时,JavaScript 会使用动态绑定来确定应该调用哪个方法。因为 childChild 类的实例,所以它会优先调用子类(Child)的方法。如果子类没有这个方法,它就会向上查找父类(Parent)。在这个例子中,父类有同名的方法,所以它会调用父类的方法。
  • 因此,输出为 'instance', msg,即 'instance' 2

总结:输出结果为:

static 1
instance 2

这是因为静态方法直接调用父类的静态方法,而实例方法在子类中调用父类的实例方法时使用了动态绑定。

4 个回答

static表示这个属性/方法属于这个类本身,而不会被实例所拥有,也就是说Child.myMethod调用的是static标识的myMethodnew Child().myMethod调用的是没有static的那个myMethod,如果Child只有static myMethod,那new Child().myMethod调用就会报错:
截屏2024-03-01 19.39.17.png
当然如果你继承extends了类,那就会沿着父类链条一直往上找,整个链条都没有就会报错,哪个环节有就调用哪个
截屏2024-03-01 19.41.04.png
这就是所谓原型链。

然后再讲supersuper你可以理解为父级,具体指向谁取决于位于类属性也就是有static标识还是实例属性,在类属性中就指向父类,实例属性就指向父实例属性,简单讲就是static中的super.xxx访问的是父类中的static xxx,没有static的同理。

所以把你的例子转换一下就差不多是下面这样:

class Parent {
  static myMethod(msg) {
    console.log('static', msg);
  }

  myMethod(msg) {
    console.log('instance', msg);
  }
}

class Child extends Parent {
  static myMethod(msg) {
    Parent.myMethod(msg);
  }

  myMethod(msg) {
    new Parent().myMethod(msg);
  }
}

Child.myMethod(1); // static 1

var child = new Child();
child.myMethod(2); // instance 2

因为static关键字 决定了里面的super是指向静态还是实例

在JavaScript中,super关键字的行为取决于它所在的上下文。在类的方法中,super可以引用父类的实例方法或静态方法,具体取决于调用super的方法本身是实例方法还是静态方法。

在你的代码中,Child类有两个myMethod方法:一个是静态的(static myMethod),另一个是实例的(myMethod)。这两个方法都使用了super.myMethod(msg)来调用父类Parent中的相应方法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题