查看: 2736|回复: 9

[交流讨论] JS脚本的新的写法尝试

[复制链接]
梦石
0
星屑
2419
在线时间
411 小时
注册时间
2021-11-7
回帖
171
发表于 2021-11-17 15:04:20 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 夏虫沉默 于 2021-11-25 22:36 编辑

JavaScript es6中提供了类的关键字class,现在js可以通过class关键字模拟类的写法,看上去更像其他面向对象的语言(java、c++之类的)了;
然后我就尝试了一下新的写法,大家可以参考下:
[pre lang="javascript" line="1"]//乘降窗口DriveWindow继承自Window_Command
class DriveWindow extends Window_Command{
        constructor(x,y){
                super(x,y);
    }
        makeCommandList(){
                this.addCommand("1号上车/下车",'onJu1',true);//队列里排序1的角色上车
                this.addCommand("2号上车/下车",'onJu2',false);//队列里排序2的角色上车,默认关闭
                this.addCommand("3号上车/下车",'onJu3',false);//队列里排序3的角色上车,默认关闭
                this.addCommand("取消",'cancel',true);
        }
}
//乘降页面DriveScene继承自Scene_MenuBase
class DriveScene extends Scene_MenuBase{
        constructor(x,y){
                super(x,y);
    }
        create() {
                super.create(this);//调用父类Scene_MenuBase的create方法效果类似于:Scene_MenuBase.prototype.create.call(this);
                this._driveWindow=new DriveWindow(5,195);
                this.addWindow(this._driveWindow);
                this._driveWindow.setHandler('cancel',this.popScene.bind(this));//使得按取消可以返回上一视图,不然无法返回
                this._driveWindow.setHandler('onJu1',this.onDriveJu1.bind(this));
                this._driveWindow.setHandler('onJu2',this.onDriveJu2.bind(this));
                this._driveWindow.setHandler('onJu3',this.onDriveJu3.bind(this));
        };
}
[/pre]
旧代码[pre lang="javascript" line="1"]//以下是之前的写法
//绘制乘降窗口
function DriveWindow(){
        this.initialize.apply(this, arguments);
}
DriveWindow.prototype = Object.create(Window_Command.prototype);
DriveWindow.prototype.constructor = DriveWindow;
DriveWindow.prototype.initialize = function(x,y) {
    Window_Command.prototype.initialize.call(this, x, y);
};
//绘制乘降视图
function DriveScene(){
        this.initialize.apply(this, arguments);
}
DriveScene.prototype = Object.create(Scene_MenuBase.prototype);
DriveScene.prototype.constructor = DriveScene;
DriveScene.prototype.initialize = function(x,y) {
    Scene_MenuBase.prototype.initialize.call(this);
};

//绘制乘降命令
DriveWindow.prototype.makeCommandList = function() {
        this.addCommand("1号上车/下车",'onJu1',true);//队列里排序1的角色上车
        this.addCommand("2号上车/下车",'onJu2',false);//队列里排序2的角色上车,默认关闭
        this.addCommand("3号上车/下车",'onJu3',false);//队列里排序3的角色上车,默认关闭       
        this.addCommand("取消",'cancel',true);
}
//当乘降视图打开时调用
DriveScene.prototype.create = function() {
    Scene_MenuBase.prototype.create.call(this);
    this._driveWindow=new DriveWindow(5,195);
    this.addWindow(this._driveWindow);
        this._driveWindow.setHandler('cancel',this.popScene.bind(this));//使得按取消可以返回上一视图,不然无法返回
        this._driveWindow.setHandler('onJu1',this.onDriveJu1.bind(this));
        this._driveWindow.setHandler('onJu2',this.onDriveJu2.bind(this));
        this._driveWindow.setHandler('onJu3',this.onDriveJu3.bind(this));
};

[/pre]

我又花了一些时间学习JS新的ES内容,原来ES6是15年新出的,(从某种程度上来说,已经不新了),有时间的话,会留下一些学习笔记,学习笔记尚杂乱。
以下部分内容参考于作者:zhoujie
来源:
https://www.cnblogs.com/zhoujie/p/node1.html

解构赋值[pre lang="javascript" line="1"]//解构赋值可以方便地交换两个变量的值
var a1 = 15,a2 = 20;
[a1, a2] = [a2, a1];
console.log(a1+","+a2);//输出 20,15
//let和var一样都可以用来定义变量,let的作用域是局部
let [x, y, z] = [7, 8, 9];//意义同let x = 7,y = 8, z = 9;
[/pre]

箭头函数=>[pre lang="javascript" line="1"]//操作符=>左边为参数,右边为具体操作和返回值。
var sum = (num1, num2) => { return num1 + num2; }//求和函数(/方法),意义同var sum = function(num1, num2) { return num1 + num2;};
//箭头函数还修复了this的指向,使其永远指向词法作用域:
var obj = {
    birth: 2000,
    getAge: function () {
        var b = this.birth; // 2000
        var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象,2021-2000
        return fn();
    }
};
console.log(obj.getAge()); // 输出21
[/pre]

操作符...[pre lang="javascript" line="1"]//通过...可以将数组作为参数直接传入函数:
var people=['Wayou','John','Sherlock','Feihu'];
function sayHello(people1,people2,people3,people4){
  //  console.log('Hello '+people1+','+people2+','+people3+','+people4);//不使用反引号·的写法
    console.log(`Hello ${people1},${people2},${people3},${people4}`);//(`反引号位于左边数字键盘1的左边)这样更方便对字符串的操作,通过${变量名}的方式直接取变量值
}
sayHello(...people);//输出:Hello Wayou,John,Sherlock,Feihu
sayHello(people[0]);//输出:Hello Wayou,undefined,undefined,undefined
[/pre]

调用方式

调用方式

forTest.rar

1.69 KB, 下载次数: 8

测试的脚本内容

fortTest3.rar

2.66 KB, 下载次数: 6

学习笔记

欲速春风山劝阻,不得恰恰不得呼。
梦石
0
星屑
100
在线时间
1022 小时
注册时间
2021-3-24
回帖
544

MZ评测员

发表于 2021-11-17 15:59:07 | 显示全部楼层
可读性增加了 还有别的提升吗
全家活光光~
回复

使用道具 举报

梦石
0
星屑
2419
在线时间
411 小时
注册时间
2021-11-7
回帖
171
 楼主| 发表于 2021-11-17 17:29:27 | 显示全部楼层
清澈淌漾 发表于 2021-11-17 15:59
可读性增加了 还有别的提升吗

代码的运行效率并未提高,因为底层还是使用原型链的方式实现的模拟类的写法,所以要先理解之前的写法才能方便找BUG;
减少了部分代码量,也更方便整理了;
默认使用的是JS的严格模式,变相提升了编写者的逻辑思维;
还有一个疑问,我的帖子编辑里怎么没有代码块blockcode的设置呢

点评

level<2?return:blockcode.enable;  发表于 2021-11-24 20:44
欲速春风山劝阻,不得恰恰不得呼。
回复

使用道具 举报

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2021-11-17 20:54:26 | 显示全部楼层
清澈淌漾 发表于 2021-11-17 15:59
可读性增加了 还有别的提升吗

可读性增加还不够吗
早年为了增加这可读性甚至专门发明了个 CoffeeScript,写完代码还得多一步把代码从 CoffeeScript 转译成 js 才能用

点评

我自己是非常推崇新写法的,一方面是因为新写法是标准了,以后没人用老写法了。另一方面老写法写起来真的太恶心……  发表于 2021-11-19 21:05
如果有写法或者性能提升是必学,否则还是看个人习惯了  发表于 2021-11-18 21:17
回复

使用道具 举报

梦石
0
星屑
307
在线时间
33 小时
注册时间
2021-11-11
回帖
14
发表于 2021-11-18 17:57:27 | 显示全部楼层
大佬有空吗。我有个MOD想叫你帮我写

评分

参与人数 1赞 +1 收起 理由
夏虫沉默 + 1 首先我也不是什么大佬,能力有限,是什么类.

查看全部评分

回复

使用道具 举报

梦石
0
星屑
307
在线时间
33 小时
注册时间
2021-11-11
回帖
14
发表于 2021-11-19 11:30:20 | 显示全部楼层
lightlanguage 发表于 2021-11-18 17:57
大佬有空吗。我有个MOD想叫你帮我写

emmm,可以私聊吗
回复

使用道具 举报

梦石
0
星屑
910
在线时间
14 小时
注册时间
2015-5-14
回帖
5
发表于 2021-11-19 15:14:51 | 显示全部楼层
大佬哇。支持,也在做mm类游戏吗

评分

参与人数 1赞 +1 收起 理由
夏虫沉默 + 1 是有打算做,完期未有期

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部