快捷导航
查看: 366|回复: 2

[脚本] RMMV、MZ插件中常用的call(this)形式解读

[复制链接]
会员等级

积分信息
金币:725
元宝:20
活跃:187
发电:0

荣誉勋章
热心会员优秀版主首批会员最佳新人

TA的形象
UID: 6 发表于 2023-2-18 22:31:57 | 显示全部楼层 |阅读模式
在我们使用的一些插件中,经常会遇到Call(this)的形式。比如官方HPConsumeSkill.js插件中的这个:
[JavaScript] 纯文本查看 复制代码
  var _Scene_Boot_start = Scene_Boot.prototype.start;
  Scene_Boot.prototype.start = function() {
    _Scene_Boot_start.call(this);//call(this)的目的是什么?
    DataManager.processHpCost();
  };


而网上对call()函数的解读又很抽象,对于我们制作RM来说还是云里雾里。所以,这里我举例来说明call(this)的实际意义。





如果查看系统默认的脚本,可以搜索到Scene_Boot.prototype.start是已经有过函数定义的,而且涉及到的东西还不少(知道有这写代码即可,不需要知道实际含义)。
[JavaScript] 纯文本查看 复制代码
Scene_Boot.prototype.start = function() {
    Scene_Base.prototype.start.call(this);
    SoundManager.preloadImportantSounds();
    if (DataManager.isBattleTest()) {  //如果是战斗测试
        DataManager.setupBattleTest();
        SceneManager.goto(Scene_Battle);
    } else if (DataManager.isEventTest()) { //如果是事件测试
        DataManager.setupEventTest();
        SceneManager.goto(Scene_Map);
    } else {  //开始普通/new游戏
        this.startNormalGame();
    }
    this.resizeScreen();
    this.updateDocumentTitle();
};


而这个HPConsumeSkill.js(技能消耗生命值)插件,又偏偏需要在启用Scene_Boot.prototype.start函数时,追加一个DataManager.processHpCost()的函数。新插件因为排序在默认脚本之后,所以当然可以重新在写一次Scene_Boot.prototype.start覆盖,最后在加上DataManager.processHpCost(),如下:
[JavaScript] 纯文本查看 复制代码
Scene_Boot.prototype.start = function() {
    Scene_Base.prototype.start.call(this);
    SoundManager.preloadImportantSounds();
    if (DataManager.isBattleTest()) {  //如果是战斗测试
        DataManager.setupBattleTest();
        SceneManager.goto(Scene_Battle);
    } else if (DataManager.isEventTest()) { //如果是事件测试
        DataManager.setupEventTest();
        SceneManager.goto(Scene_Map);
    } else {  //开始普通/new游戏
        this.startNormalGame();
    }
    this.resizeScreen();
    this.updateDocumentTitle();
    DataManager.processHpCost();//新加入的部分
};

但是这样会导致插件特别冗长,而且一旦多方面涉及此函数Scene_Boot.prototype.start,j修改会特别繁琐。
这时,插件制作者们会先使用var定义一个名词相近的变量,然后将原函数赋值给这个变量,如:
[JavaScript] 纯文本查看 复制代码
var _Scene_Boot_start = Scene_Boot.prototype.start;

然后,插件制作者重新对Scene_Boot.prototype.start进行一次定义。即帖子开头部分。
而_Scene_Boot_start.call(this);实际上就是把原先的旧函数内容从函数_Scene_Boot_start中搬运过来(注意插件制作者们一般会用下划线区分)

帖子的最近访客

回复 论坛版权

使用道具 举报

会员等级

积分信息
金币:725
元宝:20
活跃:187
发电:0

荣誉勋章
热心会员优秀版主首批会员最佳新人

TA的形象
 楼主| 发表于 2023-2-18 22:35:01 | 显示全部楼层
本帖最后由 古树旋律 于 2023-2-18 22:48 编辑

举例说明,将这段代码放入到在线工具频道下的HTML在线运行-RPGMV (rpgmz.com)实际测试一下。
第一个myFunction函数是显示Hello World!,而第二个myFunction函数是显示Hello World!和Hello!。第二个函数因排在下面,所以会覆盖掉第一个函数。如果把_myFunction.call(this);删除,则只显示Hello!

因为网站原因,“点我” 这一行的完整代码应该设置如下:
1.JPG

[Python] 纯文本查看 复制代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试实例</title>
<script>
myFunction = function()
{
    alert("Hello World!");
}

var _myFunction = myFunction;
myFunction = function()
{
        _myFunction.call(this);
    alert("Hello!");
}

</script>
</head>
 
<body>
<button>点我</button>
</body>
</html>

回复

使用道具 举报

ahome_bigavatar:guest
ahome_bigavatar:welcomelogin
您需要登录后才可以回帖 登录 | 加入民族

本版积分规则

论坛用工具

蓝凑云 hello图床 聚合图床 TinyPNG remove 代码测试 颜色代码 颜色代码2

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

实用工具

AI人工智能图片放大 图片无损放大 Deepl翻译器 百宝箱 孟坤工具箱 在线压缩图片 图片切圆角

您一共访问了本站 加载中...

Archiver|小黑屋|RPG民族

GMT+8, 2024-10-23 06:27 , Processed in 0.432345 second(s), 60 queries .

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