JavaScript之结构体数组的使用(类C语言结构体)

一、前言

习惯了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>
  1. 首先,定义构造函数mydata(x),包含2个私有数据;
  2. 然后,使用原型模式定义构造函数mydata(x)的公有数据和方法,即每个实例都可以访问,参考代码备注。
  3. 继续定义包含mydata(x)结构体数组的构造函数mybigdata(x);
  4. 同样原型模式定义构造函数mybigdata(x)的公有数据和方法。
  5. 关键:在mybigdata(x)的原型模式中需要定义init函数,用来初始化d2为包含4个mydata()实例的数组。
  6. 准备工作完成之后就来使用吧!申请实例并初始化d2;
  7. 接下来调试打印实例的使用情况,如下图所示:
    在这里插入图片描述

三、总结

实例realdata既可以访问自身的数据和方法,也可以访问mydata()实例的数据和方法,并且d2数组包含的各个私有数据相互独立,公有数据和方法是共用的,从而达到节省内存的目的。
相比C/C++的语法,构造函数就相当于结构体,原型模式定义的方法就相当于函数指针,用起来更加方便。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值