JavaScript之结构体数组的使用
一、前言
习惯了C/C++语法的我,初识Javascript,现在用js写前端代码时,遇到稍微复杂些的层次包含较多的数据结构,想着怎么用类似C语言的结构体来解决。
其实在Javascript中,就是使用面向对象编程的技术,也就是用一些变通的方法,模拟出类。网上方法很多,但是实例写的都不够想学习,这里我介绍下我觉得比较好用又节省内存的方法:构造函数模式+原型模式,并附上一个简单的使用例程。
在面向对象编程中,类(class)是对象(object)的模板,定义了同一组对象(又称"实例")共有的属性和方法。——阮一峰
二、例程:JavaScript结构体数组
话不多说,直接上段代码,然后根据代码分析。
<script>
function mydata(x) { // 1. 构造函数模式
this.a1 = x; // 定义2个实例私有的数据
this.a2 = Array(5);
}
mydata.prototype = { // 2. 原型模式
constructor: mydata,
// 实例共享数据, 注意这里用冒号:
a: 100,
// 所有实例共享原型模式中的方法
change1: function(val) {
this.a1 = val;
},
change2: function(i, val) {
this.a2[i] = val;
}
}
function mybigdata(x) { // 3. 包含结构体数组的构造函数
this.d1 = x;
this.d2 = Array(4);
}
mybigdata.prototype = { // 4. 原型模式
constructor: mybigdata,
// 5. 初始化d2为包含4个mydata()实例的数组
init: function() {
for (let i = 0; i < 4; i++) {
this.d2[i] = new mydata(123);
}
},
change1: function(val) {
this.d1 = val;
}
}
// 6. 申请实例并初始化d2
var realdata = new mybigdata(1);
realdata.init();
// 7. 调试使用
console.log("d1 = " + realdata.d1 + "\n"); // 实例访问自身数据
for (let i = 0; i < 4; i++) {
realdata.d2[i].change1(i); // 实例访问d2数组mydata实例的原型方法与数据
console.log('a = ' + realdata.d2[i].a + '; a1 = ' + realdata.d2[i].a1 + '\n');
realdata.d2[i].change2(i, 10 * i);
console.log('a2 = ' + realdata.d2[i].a2 + '\n');
}
</script>
- 首先,定义构造函数mydata(x),包含2个私有数据;
- 然后,使用原型模式定义构造函数mydata(x)的公有数据和方法,即每个实例都可以访问,参考代码备注。
- 继续定义包含mydata(x)结构体数组的构造函数mybigdata(x);
- 同样原型模式定义构造函数mybigdata(x)的公有数据和方法。
- 关键:在mybigdata(x)的原型模式中需要定义init函数,用来初始化d2为包含4个mydata()实例的数组。
- 准备工作完成之后就来使用吧!申请实例并初始化d2;
- 接下来调试打印实例的使用情况,如下图所示:
三、总结
实例realdata既可以访问自身的数据和方法,也可以访问mydata()实例的数据和方法,并且d2数组包含的各个私有数据相互独立,公有数据和方法是共用的,从而达到节省内存的目的。
相比C/C++的语法,构造函数就相当于结构体,原型模式定义的方法就相当于函数指针,用起来更加方便。