设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1573|回复: 2
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
17
在线时间
1 小时
注册时间
2022-11-25
帖子
2
跳转到指定楼层
1
发表于 2022-11-25 22:06:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
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,应该怎么实现?

Lv1.梦旅人

梦石
0
星屑
17
在线时间
1 小时
注册时间
2022-11-25
帖子
2
2
 楼主| 发表于 2022-11-26 10:09:30 | 只看该作者
已解决,把4;后面的this.initialize()删除就行,此贴终结
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4179
在线时间
503 小时
注册时间
2011-3-26
帖子
110
3
发表于 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.     }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-23 07:50

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表