查看: 2396|回复: 2

[有事请教] JavaScript子类重写initialize()方法的问题

[复制链接]
梦石
0
星屑
17
在线时间
1 小时
注册时间
2022-11-25
回帖
1
发表于 2022-11-25 22:06:41 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
[pre lang="JavaScript" line="1"]class A{
    constructor(){
        1;
        this.initialize();
    }
    initialize(){
        2;
    }
}

class B extends A{
    constructor(){
        3;
        super();
        4;
        this.initialize();
    }
    initialize(){
        5;
        super.initialize();
        6;
    }
}[/pre]


我在创建B的实例的时候,发现从3到1然后马上就到5了,而我的想法是3->1->2->4->5->6,应该怎么实现?
梦石
0
星屑
17
在线时间
1 小时
注册时间
2022-11-25
回帖
1
 楼主| 发表于 2022-11-26 10:09:30 | 显示全部楼层
已解决,把4;后面的this.initialize()删除就行,此贴终结
回复

使用道具 举报

梦石
0
星屑
5204
在线时间
457 小时
注册时间
2011-3-26
回帖
100
发表于 2022-11-26 15:34:29 | 显示全部楼层
本帖最后由 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.     }
  12. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部