加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 rpg-sheep 于 2015-11-13 15:00 编辑
众所周知,RPG Maker MV 更新后 javascript 取代了 Ruby
然而alias也随之而去……{:2_282:}
那么问题来了!怎么重定义方法!重定义方法是非常重要的一个环节,对于插件兼容性非常有用。
比如这么个代码
function test(){ } test.prototype.hahah = function(){ alert("1122") } test.prototype.hahah()
function test(){
}
test.prototype.hahah = function(){
alert("1122")
}
test.prototype.hahah()
这个代码只能输出一次1122,我想给hahah方法添加一段代码,让他再输出2222,但不改变hahah这个方法名,VA用alias可以轻松实现,然而MV呢?
function test(){ } test.prototype.hahah = function(){ alert("1122") } test.prototype.hahah2 = test.prototype.hahah; test.prototype.hahah = function(){ this.hahah2() alert("2222") } //位置1 test.prototype.hahah()
function test(){
}
test.prototype.hahah = function(){
alert("1122")
}
test.prototype.hahah2 = test.prototype.hahah;
test.prototype.hahah = function(){
this.hahah2()
alert("2222")
}
//位置1
test.prototype.hahah()
把这段话复制到一个插件里并启用测试,可以输出1122和2222。实现了对test.hahah的重定义!
我如果想再加一段呢?在刚才的位置1加一段:
test.prototype.hahah3 = test.prototype.hahah; test.prototype.hahah = function(){ this.hahah3() alert("2223") }
test.prototype.hahah3 = test.prototype.hahah;
test.prototype.hahah = function(){
this.hahah3()
alert("2223")
}
可以输出1122和2222,2223.完全没有压力,解决了多个插件同时加载防冲突的问题~
小结:
test.prototype.hahah2 = test.prototype.hahah;
test.prototype.hahah2 = test.prototype.hahah;
等同于
应用:在Scene_Map里加一个窗口Window_XY_Mission:
Scene_Map.prototype.old_createDisplayObjects = Scene_Map.prototype.createDisplayObjects; Scene_Map.prototype.createDisplayObjects = function() { this.old_createDisplayObjects(); this.XY_createMissionWindow(); }; Scene_Map.prototype.XY_createMissionWindow = function() { this._XY_MissionWindow = new Window_XY_Mission(); this.addWindow(this._XY_MissionWindow); };
Scene_Map.prototype.old_createDisplayObjects = Scene_Map.prototype.createDisplayObjects;
Scene_Map.prototype.createDisplayObjects = function() {
this.old_createDisplayObjects();
this.XY_createMissionWindow();
};
Scene_Map.prototype.XY_createMissionWindow = function() {
this._XY_MissionWindow = new Window_XY_Mission();
this.addWindow(this._XY_MissionWindow);
};
就成功在不冲突的情况下添加了窗口!(这里并没有贴出Window_XY_Mission的代码!)
语法解析:
test.prototype.hahah3 = test.prototype.hahah;//复制hahah方法到hahah3 //错误范例:test.prototype.hahah3 = test.prototype.hahah();这里不能带括号,否则就是返回结果了 test.prototype.hahah = function(){//覆盖原有hahah方法 this.hahah3();//注意这里一定要用this.hahah3(),不能用test.prototype.hahah3()! /*这里详细解释一下为什么不能用: 如果你把这句替换成test.prototype.hahah3()然后测试,是可以实现的。 但是如果你实际应用的时候不用this.,会弹出TypeError:Cannot read property 'length' of undefined。 问题就出在这句上:你会发现很多地方都有类似这句的语句:Window_xxx.prototype = Object.create(Window_Base.prototype); 这玩意讲了很多人也听不懂,所以记住用this.就行啦 */ alert("2223"); }
test.prototype.hahah3 = test.prototype.hahah;//复制hahah方法到hahah3
//错误范例:test.prototype.hahah3 = test.prototype.hahah();这里不能带括号,否则就是返回结果了
test.prototype.hahah = function(){//覆盖原有hahah方法
this.hahah3();//注意这里一定要用this.hahah3(),不能用test.prototype.hahah3()!
/*这里详细解释一下为什么不能用:
如果你把这句替换成test.prototype.hahah3()然后测试,是可以实现的。
但是如果你实际应用的时候不用this.,会弹出TypeError:Cannot read property 'length' of undefined。
问题就出在这句上:你会发现很多地方都有类似这句的语句:Window_xxx.prototype = Object.create(Window_Base.prototype);
这玩意讲了很多人也听不懂,所以记住用this.就行啦
*/
alert("2223");
}
感谢@VIPArcher的提醒~关于有参数的方法直接像这样写上就可以了
function test(){ } test.prototype.hahah = function(a,b){ alert(a+b); } test.prototype.hahah2 = test.prototype.hahah; test.prototype.hahah = function(a,b){ this.hahah2(a,b); alert(a-b); } test.prototype.hahah3 = test.prototype.hahah; test.prototype.hahah = function(a,b){ this.hahah3(a,b); alert(a*b); } test.prototype.hahah(1,2)
function test(){
}
test.prototype.hahah = function(a,b){
alert(a+b);
}
test.prototype.hahah2 = test.prototype.hahah;
test.prototype.hahah = function(a,b){
this.hahah2(a,b);
alert(a-b);
}
test.prototype.hahah3 = test.prototype.hahah;
test.prototype.hahah = function(a,b){
this.hahah3(a,b);
alert(a*b);
}
test.prototype.hahah(1,2)
输出3,-1,2。
PS
什么?你看到了Window_XY_Mission?对的,小优(rpg_sheep)正在制作RPG Maker MV的任务插件! |