鸿蒙语言TypeScript学习第16天:【类】

1、TypeScript 类

TypeScript 是面向对象的 JavaScript。

类描述了所创建的对象共同的属性和方法。

TypeScript 支持面向对象的所有特性,比如 类、接口等。

TypeScript 类定义方式如下:

class class_name { // 类作用域
}

定义类的关键字为 class,后面紧跟类名,类可以包含以下几个模块(类的数据成员):

  • 字段 − 字段是类里面声明的变量。字段表示对象的有关数据。
  • 构造函数 − 类实例化时调用,可以为类的对象分配内存。
  • 方法 − 方法为对象要执行的操作。

实例

鸿蒙开发文档参考:qr23.cn/AKFP8k点击或复制转到。

创建一个 Person 类:

TypeScript

class Person { }复制

编译以上代码,得到以下 JavaScript 代码:

JavaScript

var Person = /** @class */ (function () {function Person() {}return Person;
}());复制

2、创建类的数据成员

搜狗高速浏览器截图20240326151547.png

以下实例我们声明了类 Car,包含字段为 engine,构造函数在类实例化后初始化字段 engine。

this 关键字表示当前类实例化的对象。注意构造函数的参数名与字段名相同,this.engine 表示类的字段。

此外我们也在类中定义了一个方法 disp()。

TypeScript

class Car { // 字段 engine:string; // 构造函数 constructor(engine:string) { this.engine = engine }  // 方法 disp():void { console.log("发动机为 :   "+this.engine) } 
}复制

编译以上代码,得到以下 JavaScript 代码:

JavaScript

var Car = /** @class */ (function () {// 构造函数 function Car(engine) {this.engine = engine;}// 方法 Car.prototype.disp = function () {console.log("发动机为 :   " + this.engine);};return Car;
}());复制

3、创建实例化对象

我们使用 new 关键字来实例化类的对象,语法格式如下:

var object_name = new class_name([ arguments ])

类实例化时会调用构造函数,例如:

var obj = new Car("Engine 1")

类中的字段属性和方法可以使用 . 号来访问:

// 访问属性
obj.field_name // 访问方法
obj.function_name()

完整实例

以下实例创建来一个 Car 类,然后通过关键字 new 来创建一个对象并访问属性和方法:

TypeScript

class Car { // 字段engine:string; // 构造函数constructor(engine:string) { this.engine = engine }  // 方法disp():void { console.log("函数中显示发动机型号  :   "+this.engine) } 
} // 创建一个对象
var obj = new Car("XXSY1")// 访问字段
console.log("读取发动机型号 :  "+obj.engine)  // 访问方法
obj.disp()复制

编译以上代码,得到以下 JavaScript 代码:

JavaScript

var Car = /** @class */ (function () {// 构造函数function Car(engine) {this.engine = engine;}// 方法Car.prototype.disp = function () {console.log("函数中显示发动机型号  :   " + this.engine);};return Car;
}());
// 创建一个对象
var obj = new Car("XXSY1");
// 访问字段
console.log("读取发动机型号 :  " + obj.engine);
// 访问方法
obj.disp();复制
读取发动机型号 :  XXSY1
函数中显示发动机型号  :   XXSY1

4、类的继承

TypeScript 支持继承类,即我们可以在创建类的时候继承一个已存在的类,这个已存在的类称为父类,继承它的类称为子类。

类继承使用关键字 extends,子类除了不能继承父类的私有成员(方法和属性)和构造函数,其他的都可以继承。

TypeScript 一次只能继承一个类,不支持继承多个类,但 TypeScript 支持多重继承(A 继承 B,B 继承 C)。

语法格式如下:

class child_class_name extends parent_class_name

实例

类的继承:实例中创建了 Shape 类,Circle 类继承了 Shape 类,Circle 类可以直接使用 Area 属性:

TypeScript

class Shape { Area:number constructor(a:number) { this.Area = a } 
} class Circle extends Shape { disp():void { console.log("圆的面积:  "+this.Area) } 
}var obj = new Circle(223); 
obj.disp()复制

编译以上代码,得到以下 JavaScript 代码:

JavaScript

var __extends = (this && this.__extends) || (function () {var extendStatics = function (d, b) {extendStatics = Object.setPrototypeOf ||({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };return extendStatics(d, b);};return function (d, b) {extendStatics(d, b);function __() { this.constructor = d; }d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());};
})();
var Shape = /** @class */ (function () {function Shape(a) {this.Area = a;}return Shape;
}());
var Circle = /** @class */ (function (_super) {__extends(Circle, _super);function Circle() {return _super !== null && _super.apply(this, arguments) || this;}Circle.prototype.disp = function () {console.log("圆的面积:  " + this.Area);};return Circle;
}(Shape));
var obj = new Circle(223);
obj.disp();复制

输出结果为:

圆的面积:  223

需要注意的是子类只能继承一个父类,TypeScript 不支持继承多个类,但支持多重继承,如下实例:

TypeScript

class Root { str:string; 
} class Child extends Root {} 
class Leaf extends Child {} // 多重继承,继承了 Child 和 Root 类var obj = new Leaf(); 
obj.str ="hello" 
console.log(obj.str)复制

编译以上代码,得到以下 JavaScript 代码:

JavaScript

var __extends = (this && this.__extends) || (function () {var extendStatics = function (d, b) {extendStatics = Object.setPrototypeOf ||({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };return extendStatics(d, b);};return function (d, b) {extendStatics(d, b);function __() { this.constructor = d; }d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());};
})();
var Root = /** @class */ (function () {function Root() {}return Root;
}());
var Child = /** @class */ (function (_super) {__extends(Child, _super);function Child() {return _super !== null && _super.apply(this, arguments) || this;}return Child;
}(Root));
var Leaf = /** @class */ (function (_super) {__extends(Leaf, _super);function Leaf() {return _super !== null && _super.apply(this, arguments) || this;}return Leaf;
}(Child)); // 多重继承,继承了 Child 和 Root 类
var obj = new Leaf();
obj.str = "hello";
console.log(obj.str);复制

输出结果为:

hello

5、继承类的方法重写

类继承后,子类可以对父类的方法重新定义,这个过程称之为方法的重写。

其中 super 关键字是对父类的直接引用,该关键字可以引用父类的属性和方法。

TypeScript

class PrinterClass { doPrint():void {console.log("父类的 doPrint() 方法。") } 
} class StringPrinter extends PrinterClass { doPrint():void { super.doPrint() // 调用父类的函数console.log("子类的 doPrint()方法。")} 
}复制

编译以上代码,得到以下 JavaScript 代码:

JavaScript

var obj = new StringPrinter() 
obj.doPrint()var __extends = (this && this.__extends) || (function () {var extendStatics = function (d, b) {extendStatics = Object.setPrototypeOf ||({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };return extendStatics(d, b);};return function (d, b) {extendStatics(d, b);function __() { this.constructor = d; }d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());};
})();
var PrinterClass = /** @class */ (function () {function PrinterClass() {}PrinterClass.prototype.doPrint = function () {console.log("父类的 doPrint() 方法。");};return PrinterClass;
}());
var StringPrinter = /** @class */ (function (_super) {__extends(StringPrinter, _super);function StringPrinter() {return _super !== null && _super.apply(this, arguments) || this;}StringPrinter.prototype.doPrint = function () {_super.prototype.doPrint.call(this); // 调用父类的函数console.log("子类的 doPrint()方法。");};return StringPrinter;
}(PrinterClass));
var obj = new StringPrinter();
obj.doPrint();复制

输出结果为:

父类的 doPrint() 方法。
子类的 doPrint()方法。

6、static 关键字

static 关键字用于定义类的数据成员(属性和方法)为静态的,静态成员可以直接通过类名调用。

TypeScript

class StaticMem {  static num:number; static disp():void { console.log("num 值为 "+ StaticMem.num) } 
} StaticMem.num = 12     // 初始化静态变量
StaticMem.disp()       // 调用静态方法复制

编译以上代码,得到以下 JavaScript 代码:

JavaScript

var StaticMem = /** @class */ (function () {function StaticMem() {}StaticMem.disp = function () {console.log("num 值为 " + StaticMem.num);};return StaticMem;
}());
StaticMem.num = 12; // 初始化静态变量
StaticMem.disp(); // 调用静态方法复制

输出结果为:

num 值为 12

7、instanceof 运算符

instanceof 运算符用于判断对象是否是指定的类型,如果是返回 true,否则返回 false。

TypeScript

class Person{ } 
var obj = new Person() 
var isPerson = obj instanceof Person; 
console.log("obj 对象是 Person 类实例化来的吗? " + isPerson);复制

编译以上代码,得到以下 JavaScript 代码:

JavaScript

var Person = /** @class */ (function () {function Person() {}return Person;
}());
var obj = new Person();
var isPerson = obj instanceof Person;
console.log(" obj 对象是 Person 类实例化来的吗? " + isPerson);复制

输出结果为:

obj 对象是 Person 类实例化来的吗? true

8、访问控制修饰符

TypeScript 中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。TypeScript 支持 3 种不同的访问权限。

  • public(默认) : 公有,可以在任何地方被访问。
  • protected : 受保护,可以被其自身以及其子类访问。
  • private : 私有,只能被其定义所在的类访问。

以下实例定义了两个变量 str1 和 str2,str1 为 public,str2 为 private,实例化后可以访问 str1,如果要访问 str2 则会编译错误。

TypeScript

class Encapsulate { str1:string = "hello" private str2:string = "world" 
}var obj = new Encapsulate() 
console.log(obj.str1)     // 可访问 
console.log(obj.str2)   // 编译错误, str2 是私有的复制

9、类和接口

类可以实现接口,使用关键字 implements,并将 interest 字段作为类的属性使用。

以下实例中 AgriLoan 类实现了 ILoan 接口:

TypeScript

interface ILoan { interest:number 
} class AgriLoan implements ILoan { interest:number rebate:number constructor(interest:number,rebate:number) { this.interest = interest this.rebate = rebate } 
} var obj = new AgriLoan(10,1) 
console.log("利润为 : "+obj.interest+",抽成为 : "+obj.rebate )复制

编译以上代码,得到以下 JavaScript 代码:

JavaScript

ar AgriLoan = /** @class */ (function () {function AgriLoan(interest, rebate) {this.interest = interest;this.rebate = rebate;}return AgriLoan;
}());
var obj = new AgriLoan(10, 1);
console.log("利润为 : " + obj.interest + ",抽成为 : " + obj.rebate);复制

输出结果为:

利润为 : 10,抽成为 : 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Collection接口和List接口作用和解析

在 Java 中,Collection接口和List接口都是处理集合数据的重要接口。 Collection接口是所有集合类的父接口,它定义了一些基本的集合操作方法,例如: 添加元素:add(E e)移除元素:remove(Object o)清空集合&a…

专业照片编辑软件ON1 Photo RAW 2024 mac/win

ON1 Photo RAW 2024 for Mac是一款集专业性与易用性于一体的照片编辑软件。它拥有简洁直观的用户界面,即便对于摄影新手,也能快速上手。软件支持RAW格式照片处理,能够完整保留照片原始信息,让后期调整更加灵活。 在功能方面&#…

boost之bimaps

Boost.Bimap 是 Boost 库中的一个容器,它支持双向映射,即允许通过键查找值,也允许通过值查找键。 Boost.Bimap 的主要功能介绍如下: 双向查找:与 STL 中的 map 和 multimap 不同,这两者只能进行单向映射&a…

基于LabVIEW的CAN通信系统开发案例

基于LabVIEW的CAN通信系统开发案例 介绍了基于LabVIEW开发的CAN通信系统,该系统主要用于汽车行业的数据监控与分析。通过对CAN通信协议的有效应用,实现了车辆控制系统的高效信息交换与实时数据处理,从而提升了车辆性能的检测与优化能力。 项…

点击按钮(文字)调起elementUI大图预览

时隔一年,我又回来了 ~ 最近在做后台,遇到一个需求,就是点击“查看详情”按钮,调起elementUI的大图预览功能,预览多张图片,如下图: 首先想到的是使用element-ui的el-image组件,但它是…

Elasticsearch中父子文档的关联:利用Join类型赋予文档的层级关系

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! Elasticsearch是一个强大的搜索引擎,它提供了丰富的功能来满足复杂的搜索需求。其中,父子索引类型的join功…

蓝桥杯之注意事项

1.特殊求解的地方 2.一些数学公式 比如二叉树求全深度数值那道题 3.掌握有关库函数 #include<algorithm> 包含sort&#xff08;&#xff09;函数【排列函数】C sort()排序详解-CSDN博客&#xff0c;next_permutation()函数【求解全排列问题】求解数组大小sizeof(arr…

Qt自定义标题栏【即取即用模板】

头文件 #ifndef TITLEWDG_H #define TITLEWDG_H#include <QWidget>namespace Ui { class TitleWdg; }class TitleWdg : public QWidget {Q_OBJECTpublic:explicit TitleWdg(QWidget *parent nullptr);~TitleWdg(); signals:void maximize();void minimize();void cl…

商业银行风险管理

商业银行风险管理 银行业风险类型概述管理信用风险管理利率风险缺口分析 持续期分析利率互换消除利率风险表外业务的风险管理 银行业风险类型概述 信用风险市场风险&#xff08;利率风险、汇率风险等市场价 格风险&#xff09;财务风险&#xff08;流动性风险&#xff09;操作…

【Java EE】 IoC详解(Bean的存储)

文章目录 &#x1f38d;Controller&#xff08;控制器存储&#xff09;&#x1f338;如何从Spring容器中获取对象&#xff08;ApplicationContext&#xff09;&#x1f338;获取bean对象的其他方式&#xff08;BeanFactory&#xff09;&#x1f338;Bean 命名约定&#x1f338;…

判断密码c++

题目描述 某平台对新用户注册密码做如下限制: ①长度是8到16位&#xff0c;如果不符会给出提示“password should be 8 to 16 long" ②逐一判断密码字符&#xff0c;如果是纯数字就给出提示“password should not be entirely numeric”&#xff0c;如果密码符合以上要…

支持向量机模型

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个支持向量机模型程序,最后打印5个条件分别的影响力。 示例一 为了计算每个条件对一件事情发生的影响力&#xff0c…

Linux nfs挂载失败处理

mount.nfs: access denied by server while mounting 192.168.0.1:/home/test 其中一种可能原因是文件目录没有nfs权限&#xff0c;可以编辑/etc/exports文件添加权限后重试&#xff1a; /home/xxx *(insecure,rw,sync,no_root_squash,no_all_squash,no_subtree_check) 参考资…

6-测试内存告警

在 CentOS 8 中&#xff0c;如果你无法直接找到 epel-release 包或是遇到其他仓库配置问题&#xff0c;你可能需要使用其他方式添加EPEL仓库。由于 CentOS 8 已经达到了其生命周期的结束&#xff0c;官方仓库和EPEL仓库的管理可能会有所不同。这里有一种方法可以手动添加EPEL仓…

【笔记】EF文件中定义的SPN显示协议规则

规则配置 SPN_bit 和PLMN_bit对应EF_SPN的bit1和bit2 如EF_SPN: bit10&#xff1b;bit2 0&#xff0c; 则HOME显示SPN&#xff0c;ROAMING显示SPN-PLMN SPN_bit 2, PLMN_bit 0 显示SPN&#xff0c;不显示PLMN。 客制化通过CarrierConfig “spn_display_condition_override_…

【Spring进阶系列丨第九篇】基于XML的面向切面编程(AOP)详解

文章目录 一、基于XML的AOP1.1、打印日志案例1.1.1、beans.xml中添加aop的约束1.1.2、定义Bean 1.2、定义记录日志的类【切面】1.3、导入AOP的依赖1.4、主配置文件中配置AOP1.5、测试1.6、切入点表达式1.6.1、访问修饰符可以省略1.6.2、返回值可以使用通配符&#xff0c;表示任…

静电场中的导体与介质

静电场可能分布于填充了各种媒质的区域。虽然媒质宏观上保持电中性&#xff0c;但其内部的各种微观带电系统不可避免地会与静电场相互作用。 一般而言&#xff0c;媒质可分为三类&#xff1a;导体、介质(绝缘体)和半导体。在静电场中半导体特性与导体类似&#xff0c;因此仅就…

10. TypeScript面向对象的类(Class)

在 TypeScript 中&#xff0c;类是面向对象编程的基础&#xff0c;它们提供了一种方式来封装数据和行为。本文将详细介绍 TypeScript 中类的概念和用法。TypeScript扩展了ES的功能&#xff0c;跟JAVA关于面向对象的概念和写法很类似。 1. 类的基本概念 在 TypeScript 中&#…

964: 数细胞

样例&#xff1a; 解法&#xff1a; 1.遍历矩阵 2.判断矩阵[i][j]&#xff0c;若是未标记细胞则遍历相邻所有未标记细胞并标记&#xff0c;且计数 实现&#xff1a;遍历相邻所有未标记细胞 以DFS实现&#xff1a; function dfs(当前状态) {if (终止条件) {}vis[标记当前状…

.NET 设计模式—迭代器模式(Iterator Pattern)

简介 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许我们通过提供一种方法来访问聚合对象中的元素&#xff0c;而不需要暴露聚合对象的内部实现。在迭代器模式中&#xff0c;我们通过创建一个迭代器对象来遍历聚合对象中的元素&a…