Project1

标题: JavaScript子类重写initialize()方法的问题 [打印本页]

作者: lsyanling    时间: 2022-11-25 22:06
标题: JavaScript子类重写initialize()方法的问题
JAVASCRIPT 代码复制
  1. class A{
  2.     constructor(){
  3.         1;
  4.         this.initialize();
  5.     }
  6.     initialize(){
  7.         2;
  8.     }
  9. }
  10.  
  11. class B extends A{
  12.     constructor(){
  13.         3;
  14.         super();
  15.         4;
  16.         this.initialize();
  17.     }
  18.     initialize(){
  19.         5;
  20.         super.initialize();
  21.         6;
  22.     }
  23. }



我在创建B的实例的时候,发现从3到1然后马上就到5了,而我的想法是3->1->2->4->5->6,应该怎么实现?
作者: lsyanling    时间: 2022-11-26 10:09
已解决,把4;后面的this.initialize()删除就行,此贴终结
作者: rfvtgbzxc    时间: 2022-11-26 15:34
本帖最后由 rfvtgbzxc 于 2022-11-26 15:36 编辑

删除以后是3->1->5->2->6->4,还是在所有的constructor执行完成之前就调用了initialize。
MZ这里的源代码有点小坑,仔细看的话会发现子类的constructor根本就不会调用父类的constructor。而是用自己的initialize代替了类似功能。这种语法用es6的class写时会提示“没有在构造函数中写super进行父类构造”,但是es5这样写不会报错。
所以如果用class语法继承MZ类似的父类,可以直接不写constructor,让参数交给MZ的那个父类的constructor自己处理。而自己只写initialize,仿照MZ的类形态,写一个super.initialize(args)即可。
  1. class Window_AlchemyHelpCategory extends Window_HorzCommand {
  2.     // 可写可不写
  3.     constructor() {
  4.       super(...arguments);
  5.       //this.initialize(...arguments); //这个不需要,写了的话就不能super否则会调用2次initialize。但不写super又会被编辑器提示不符合规范
  6.     }
  7.     initialize(rect) {
  8.       super.initialize(rect);
  9.       // 初始化成员,此时可以确保所有父类的initialize已经调用,逻辑与MZ的function.prototpye的写法是一致的
  10.       this.items = [];
  11.     }
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1