鸿蒙Class实战:从零构建联系人列表

一、先理解 Class(类)的核心概念

Class 是面向对象编程(OOP)的核心,你可以把它理解成创建对象的 "模板"

  • 模板里定义了对象的「属性」(比如人的姓名、年龄)和「行为」(比如走路、说话);
  • 用这个模板创建的具体实例,就是「对象」(比如 "张三" 这个具体的人)。
基础特性(新手必懂)
  1. 构造方法 :创建对象时自动执行,用于初始化属性(鸿蒙 / Java/TS 中常用 constructor 或类名作为构造方法);
  2. 成员变量 :类的属性(比如 nameage);
  3. 成员方法 :类的行为(比如 sayHello());
  4. 继承 :子类可以复用父类的属性和方法(鸿蒙中用 extends)。

二、鸿蒙项目中 Class 的使用场景

鸿蒙(HarmonyOS)主流开发语言是 ArkTS(TypeScript 超集),下面以 ArkTS 为例,结合鸿蒙最常见的「自定义数据模型」场景,给一个完整可运行的案例。

场景说明

假设你要做一个鸿蒙应用的 "联系人列表",需要定义「联系人」类,包含姓名、电话、头像等属性,以及 "拨打电话""显示信息" 的方法。

完整案例(基于鸿蒙 Stage 模型)
步骤 1:定义 Class 类(联系人模型)

在项目的 entry/src/main/ets/model 目录下新建 Contact.ets 文件(建议把类放在 model 目录,符合鸿蒙最佳实践):

TypeScript 复制代码
// Contact.ets - 联系人类(模板)
export class Contact {
  // 1. 成员变量(属性)
  name: string; // 姓名
  phone: string; // 电话
  avatar: string; // 头像路径(鸿蒙资源路径)

  // 2. 构造方法:创建对象时初始化属性
  constructor(name: string, phone: string, avatar: string = 'images/default_avatar.png') {
    this.name = name; // this 指向当前对象
    this.phone = phone;
    this.avatar = avatar; // 头像默认值:项目默认头像
  }

  // 3. 成员方法(行为):拨打电话
  callPhone(): void {
    // 鸿蒙中调用系统电话能力(这里简化为打印,实际需申请权限)
    console.log(`正在拨打 ${this.name} 的电话:${this.phone}`);
  }

  // 4. 成员方法:显示联系人完整信息
  showInfo(): string {
    return `姓名:${this.name},电话:${this.phone},头像:${this.avatar}`;
  }

  // 5. 静态方法(无需创建对象即可调用):验证手机号格式
  static checkPhone(phone: string): boolean {
    const reg = /^1[3-9]\d{9}$/; // 简单的手机号正则
    return reg.test(phone);
  }
}
步骤 2:在鸿蒙页面中使用这个 Class

在项目的 entry/src/main/ets/pages 目录下的 Index.ets 中使用该类:

TypeScript 复制代码
// Index.ets - 鸿蒙主页面
import { Contact } from '../model/Contact'; // 导入自定义类

@Entry
@Component
struct Index {
  // 定义联系人列表(存储 Contact 对象)
  private contactList: Contact[] = [
    new Contact('张三', '13800138000'), // 使用构造方法创建对象
    new Contact('李四', '13900139000', 'images/lisi_avatar.png'), // 自定义头像
    new Contact('王五', '12345678901') // 无效手机号(用于测试静态方法)
  ];

  build() {
    Column() {
      Text('联系人列表')
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
        .margin({ bottom: 20 });

      // 遍历联系人列表,渲染每个联系人
      List() {
        ForEach(this.contactList, (item: Contact) => {
          ListItem() {
            Row() {
              // 头像(鸿蒙 Image 组件)
              Image($r('app.media.' + item.avatar.split('/')[1])) // 适配鸿蒙资源引用
                .width(50)
                .height(50)
                .borderRadius(25)
                .marginRight(10);

              // 联系人信息
              Column() {
                Text(item.name)
                  .fontSize(20);
                Text(item.phone)
                  .fontSize(14)
                  .fontColor(Color.Grey);

                // 验证手机号并显示结果
                Text(`手机号有效:${Contact.checkPhone(item.phone)}`)
                  .fontSize(12)
                  .fontColor(Contact.checkPhone(item.phone) ? Color.Green : Color.Red)
                  .marginTop(5);
              }

              // 拨打电话按钮
              Button('拨打')
                .marginLeft(20)
                .onClick(() => {
                  item.callPhone(); // 调用对象的方法
                })
            }
            .padding(10)
            .width('100%')
          }
        })
      }
      .width('100%')
      .height('80%')
    }
    .padding(20)
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center);
  }
}
步骤 3:效果说明
  1. 运行鸿蒙模拟器后,页面会显示 3 个联系人;
  2. 每个联系人会显示姓名、电话、手机号有效性;
  3. 点击 "拨打" 按钮,控制台会打印 "正在拨打 XXX 的电话:XXXX";
  4. 王五的手机号是无效格式,会显示红色的 "手机号有效:false"。
关键说明(鸿蒙特有的注意点)
  1. 资源引用 :鸿蒙中图片资源需放在 entry/src/main/resources/media 目录,代码中用 $r('app.media.文件名') 引用;

  2. 权限(可选) :如果要实际调用系统电话,需在 module.json5 中添加电话权限:

    json

    TypeScript 复制代码
    {
      "module": {
        "abilities": [...],
        "requestPermissions": [
          {
            "name": "ohos.permission.CALL_PHONE"
          }
        ]
      }
    }
  3. Class 与鸿蒙组件结合 :可以把 Class 对象绑定到鸿蒙的 ForEachList 等组件,实现数据驱动 UI。


三、拓展:Class 继承的案例(鸿蒙中常用)

如果需要定义「企业联系人」(继承普通联系人,新增 "公司名称" 属性),可以这样写:

TypeScript 复制代码
// EnterpriseContact.ets
import { Contact } from './Contact';

export class EnterpriseContact extends Contact {
  company: string; // 新增属性:公司名称

  // 构造方法:调用父类构造方法 + 初始化子类属性
  constructor(name: string, phone: string, company: string, avatar?: string) {
    super(name, phone, avatar); // 调用父类构造方法
    this.company = company;
  }

  // 重写父类方法:扩展显示信息
  override showInfo(): string {
    return `${super.showInfo()},公司:${this.company}`;
  }
}

// 在页面中使用
// const enterpriseContact = new EnterpriseContact('赵六', '13700137000', '鸿蒙科技');
// console.log(enterpriseContact.showInfo()); 
// 输出:姓名:赵六,电话:13700137000,头像:images/default_avatar.png,公司:鸿蒙科技

总结

  1. Class 核心:是创建对象的模板,包含属性(成员变量)和行为(成员方法),构造方法用于初始化对象;
  2. 鸿蒙中使用
    • 建议把 Class 放在 model 目录,通过 export/import 复用;
    • 常用于定义数据模型(如联系人、商品),结合鸿蒙 UI 组件实现数据渲染;
  3. 关键特性 :继承(extends)可复用父类逻辑,静态方法无需创建对象即可调用。
相关推荐
sudo_jin1 小时前
从“输入网址”到“帧级控制”:我对事件循环与主线程管理的终极认知
前端·javascript
Irene19911 小时前
JavaScript中内置对象分类总结
javascript·内置对象
霍理迪2 小时前
Vue—条件渲染与循环渲染
前端·javascript·vue.js
zhen_hong2 小时前
ReactAgent原理
android·java·javascript
小J听不清2 小时前
CSS 内边距(padding)全解析:取值规则 + 表格实战
前端·javascript·css·html·css3
zhangjikuan892 小时前
在 ArkTS 中,Promise 的使用比 TypeScript 更严格(必须显式指定泛型类型)
前端·javascript·typescript
Highcharts.js2 小时前
React 如何实现大数据量图表(性能优化指南)
前端·javascript·react.js·信息可视化·集成·highcharts
向上的车轮2 小时前
TypeORM——基于 TypeScript/JavaScript 的对象关系映射(ORM)框架
javascript·typescript·typeorm
程序员小寒2 小时前
JavaScript设计模式(一):单例模式实现与应用
javascript·单例模式·设计模式