【零基础入门TypeScript】类 - class

目录

创建类

句法

示例:声明一个类

创建实例对象

句法

示例:实例化一个类

访问属性和函数

示例:将它们放在一起

类继承

句法

示例:类继承

例子

输出

TypeScript ─ 类继承和方法重写

静态关键字

例子

实例操作符

例子

数据隐藏

例子

类和接口



TypeScript 是面向对象的 JavaScript。TypeScript 支持面向对象的编程功能,如类、接口等。OOP 中的类是创建对象的蓝图。类封装了对象的数据。Typescript 为这个称为类的概念提供了内置支持。JavaScript ES5 或更早版本不支持类。Typescript 从 ES6 中获得了这个功能。

创建类

使用 class 关键字在 TypeScript 中声明类。其语法如下 -

句法

class class_name { //class scope 
}

class 关键字后跟类名。命名类时必须考虑标识符的规则。

类定义可以包括以下内容 -

  • 字段- 字段是类中声明的任何变量。字段表示与对象相关的数据

  • 构造函数- 负责为类的对象分配内存

  • 函数- 函数表示对象可以采取的操作。它们有时也被称为方法

这些组件组合在一起称为类的数据成员。

考虑打字稿中的 Person 类。

class Person { }

编译时,它将生成以下 JavaScript 代码。

//Generated by typescript 1.8.10
var Person = (function () { function Person() { } return Person; }());

示例:声明一个类


class Car { //field engine:string; //constructor constructor(engine:string) { this.engine = engine }  //function disp():void { console.log("Engine is  :   "+this.engine) } 
}

该示例声明了一个 Car 类。该类有一个名为engine 的字段。声明字段时不使用var关键字。上面的示例声明了该类的构造函数。

构造函数是类的一个特殊函数,负责初始化类的变量。TypeScript 使用 constructor 关键字定义构造函数。构造函数是一个函数,因此可以参数化。

this关键字引用该类的当前实例。这里,参数名称和类的字段名称是相同的。因此,为了避免歧义,类的字段以this关键字为前缀。

disp()是一个简单的函数定义。请注意,这里没有使用 function 关键字。

编译时,它将生成以下 JavaScript 代码。


//Generated by typescript 1.8.10
var Car = (function () {//constructorfunction Car(engine) {this.engine = engine;}//functionCar.prototype.disp = function () {console.log("Engine is  :   " + this.engine);};return Car;
}());

创建实例对象

要创建类的实例,请使用new关键字,后跟类名。其语法如下 -

句法

var object_name = new class_name([ arguments ])
  • new关键字负责实例化

  • 表达式的右侧调用构造函数。如果构造函数是参数化的,则应该向其传递值。

示例:实例化一个类

var obj = new Car("Engine 1")

访问属性和函数

类的属性和函数可以通过对象来访问。使用 ' 。' 点符号(称为句点)来访问类的数据成员。

//accessing an attribute 
obj.field_name //accessing a function 
obj.function_name()

示例:将它们放在一起


class Car { //field engine:string; //constructor constructor(engine:string) { this.engine = engine }  //function disp():void { console.log("Function displays Engine is  :   "+this.engine) } 
} //create an object 
var obj = new Car("XXSY1")//access the field 
console.log("Reading attribute value Engine as :  "+obj.engine)  //access the function
obj.disp()

编译时,它将生成以下 JavaScript 代码。


//Generated by typescript 1.8.10
var Car = (function () {//constructorfunction Car(engine) {this.engine = engine;}//functionCar.prototype.disp = function () {console.log("Function displays Engine is  :   " + this.engine);};return Car;
}());//create an object
var obj = new Car("XXSY1");//access the field
console.log("Reading attribute value Engine as :  " + obj.engine);//access the function
obj.disp();

上述代码的输出如下 -

Reading attribute value Engine as :  XXSY1 
Function displays Engine is  :   XXSY1

类继承

TypeScript 支持继承的概念。继承是程序从现有类创建新类的能力。扩展以创建更新的类的类称为父类/超类。新创建的类称为子类/子类。

一个类使用“extends”关键字从另一个类继承。子类从父类继承除私有成员和构造函数之外的所有属性和方法。

句法

class child_class_name extends parent_class_name

但是,TypeScript 不支持多重继承。

示例:类继承


class Shape { Area:number constructor(a:number) { this.Area = a } 
} class Circle extends Shape { disp():void { console.log("Area of the circle:  "+this.Area) } 
}var obj = new Circle(223); 
obj.disp()

编译时,它将生成以下 JavaScript 代码。


//Generated by typescript 1.8.10
var __extends = (this && this.__extends) || function (d, b) {for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];function __() { this.constructor = d; }d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var Shape = (function () {function Shape(a) {this.Area = a;}return Shape;
}());var Circle = (function (_super) {__extends(Circle, _super);function Circle() {_super.apply(this, arguments);}Circle.prototype.disp = function () { console.log("Area of the circle:  " + this.Area); };return Circle;
}(Shape));var obj = new Circle(223);
obj.disp();

上述代码的输出如下 -

Area of the Circle: 223

上面的示例声明了一个 Shape 类。该类由 Circle 类扩展。由于类之间存在继承关系,子类(即类Car)可以隐式访问其父类属性(即区域)。

继承可分为 -

  • Single - 每个类最多可以从一个父类扩展

  • 多个- 一个类可以从多个类继承。TypeScript 不支持多重继承。

  • 多级- 以下示例显示了多级继承的工作原理。

例子


class Root { str:string; 
} class Child extends Root {} 
class Leaf extends Child {} //indirectly inherits from Root by virtue of inheritance  var obj = new Leaf(); 
obj.str ="hello" 
console.log(obj.str)

Leaf 类通过多级继承从 Root 类和 Child 类派生属性。

编译时,它将生成以下 JavaScript 代码。


//Generated by typescript 1.8.10
var __extends = (this && this.__extends) || function (d, b) {for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];function __() { this.constructor = d; }d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};var Root = (function () {function Root() {}return Root;
}());var Child = (function (_super) {__extends(Child, _super);function Child() {_super.apply(this, arguments);}return Child;
}(Root));var Leaf = (function (_super) {__extends(Leaf, _super);function Leaf() {_super.apply(this, arguments);}return Leaf;
}(Child));var obj = new Leaf();
obj.str = "hello";
console.log(obj.str);

其输出如下 -

输出

hello

TypeScript ─ 类继承和方法重写

方法重写是子类重新定义超类方法的一种机制。下面的例子说明了同样的情况 -


class PrinterClass { doPrint():void {console.log("doPrint() from Parent called…") } 
} class StringPrinter extends PrinterClass { doPrint():void { super.doPrint() console.log("doPrint() is printing a string…")} 
} var obj = new StringPrinter() 
obj.doPrint()

super 关键字用于引用类的直接父类。该关键字可用于引用变量、属性或方法的超类版本。第 13 行调用 doWork() 函数的超类版本。

编译时,它将生成以下 JavaScript 代码。


//Generated by typescript 1.8.10
var __extends = (this && this.__extends) || function (d, b) {for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];function __() { this.constructor = d; }d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};var PrinterClass = (function () {function PrinterClass() {}PrinterClass.prototype.doPrint = function () { console.log("doPrint() from Parent called…"); };return PrinterClass;
}());var StringPrinter = (function (_super) {__extends(StringPrinter, _super);function StringPrinter() {_super.apply(this, arguments);}StringPrinter.prototype.doPrint = function () {_super.prototype.doPrint.call(this);console.log("doPrint() is printing a string…");};return StringPrinter;
}(PrinterClass));var obj = new StringPrinter();
obj.doPrint();

上述代码的输出如下 -

doPrint() from Parent called… 
doPrint() is printing a string…

静态关键字

static 关键字可以应用于类的数据成员。静态变量会保留其值,直到程序完成执行。静态成员通过类名引用。

例子


class StaticMem {  static num:number; static disp():void { console.log("The value of num is"+ StaticMem.num) } 
} StaticMem.num = 12     // initialize the static variable 
StaticMem.disp()      // invoke the static method

编译时,它将生成以下 JavaScript 代码。


//Generated by typescript 1.8.10
var StaticMem = (function () {function StaticMem() {}StaticMem.disp = function () {console.log("The value of num is" + StaticMem.num);};return StaticMem;
}());StaticMem.num = 12;     // initialize the static variable
StaticMem.disp();      // invoke the static method

上述代码的输出如下 -

The value of num is 12

实例操作符

如果对象属于指定类型,instanceof 运算符将返回true 

例子

class Person{ } 
var obj = new Person() 
var isPerson = obj instanceof Person; 
console.log(" obj is an instance of Person " + isPerson);

编译时,它将生成以下 JavaScript 代码。


//Generated by typescript 1.8.10
var Person = (function () {function Person() {}return Person;
}());var obj = new Person();
var isPerson = obj instanceof Person;
console.log(" obj is an instance of Person " + isPerson);

上述代码的输出如下 -

obj is an instance of Person True 

数据隐藏

类可以控制其数据成员对其他类的成员的可见性。此功能称为数据隐藏或封装。

面向对象使用访问修饰符或访问说明符的概念来实现封装的概念。访问说明符/修饰符定义类的数据成员在其定义类之外的可见性。

TypeScript 支持的访问修饰符是 -

编号访问说明符和描述
1.

民众

公共数据成员具有通用的可访问性。类中的数据成员默认是公共的。

2.

私人的

私有数据成员只能在定义这些成员的类中访问。如果外部类成员尝试访问私有成员,编译器会抛出错误。

3.

受保护的

受保护的数据成员可由与前者相同的类中的成员以及子类的成员访问。

例子

现在让我们举个例子来看看数据隐藏是如何工作的 -

class Encapsulate { str:string = "hello" private str2:string = "world" 
}var obj = new Encapsulate() 
console.log(obj.str)     //accessible 
console.log(obj.str2)   //compilation Error as str2 is private

该类有两个字符串属性 str1 和 str2,分别是公共成员和私有成员。该类被实例化。该示例返回编译时错误,因为私有属性 str2 在声明它的类之外被访问。

类和接口

类也可以实现接口。


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("Interest is : "+obj.interest+" Rebate is : "+obj.rebate )

AgriLoan 类实现 Loan 接口。因此,现在该类别对将财产权益纳入其成员具有约束力。

编译时,它将生成以下 JavaScript 代码。


//Generated by typescript 1.8.10
var AgriLoan = (function () {function AgriLoan(interest, rebate) {this.interest = interest;this.rebate = rebate;}return AgriLoan;
}());var obj = new AgriLoan(10, 1);
console.log("Interest is : " + obj.interest + " Rebate is : " + obj.rebate);

上述代码的输出如下 -

Interest is : 10 Rebate is : 1

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【前端入门】设计模式+单多页+React

设计模式是一种解决特定问题的经验总结,它提供了经过验证的解决方案,可以在软件开发过程中使用。设计模式可以帮助前端开发人员更有效地组织和管理代码,并提供一种共享的语言和框架,以便与其他开发人员进行交流。 以下是一些常见…

【盲源分离】快速理解FastICA算法(附MATLAB绘图程序)

今天讲一个在信号分析领域较为常用的一个方法,即盲源分离算法中的FastICA。 我们先从一个经典的问题引入。 一、鸡尾酒舞会问题 想象一下,你身处一个熙熙攘攘的鸡尾酒舞会中。四周回荡着各种声音:笑声、交谈声、玻璃碰撞声,甚至…

【C++干货基地】C++:函数重载(深度解析Windows和Linux下函数的修饰规则)

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位铁汁们好啊,我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的…

nacos开启鉴权+springboot配置用户名密码

nacos默认没有开启鉴权,springboot无需用户名密码即可连接nacos。从2.2.2版本开始,默认控制台也无需登录直接可进行操作。 因此本文记录一下如何开启鉴权,基于nacos2.3.0版本。 编辑nacos服务端的application.properties: # 开…

【wow-ts学习笔记】Vue3第一章:模板

本课程是DW内测开源课程wow-ts项目的学习笔记 项目地址: https://github.com/datawhalechina/wow-ts 什么是 Vue3​ Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并…

DCIC 2024 数据要素赛道算力资源申请与使用指南

云资源开通 企业认证通过后,由企业账号申请开通资源池服务 开通资源池服务 控制台左侧菜单【云资源】--【ModelArts】--【开通服务】后,方可申请专属资源,等待申请通过后即可正常使用资源。 OBS Browser使用 对象存储服务OBS是一个基…

css字体随着屏幕自适应

场景: 假设,字体为70px 在大屏显示正常,但是在笔记本上文字就换行了。我想字体随着屏幕变化而变化。 方法: 使用clamp函数,该函数接收三个参数:分别为 最小值,首选值,最大值。 .d…

java原理及插件,2022大厂Java面试必问题目

CAP原则 在分布式系统要满足CAP原则,一个提供数据服务的存储系统无法同时满足:数据一致性、数据可用性、分区耐受性。 C数据一致性:所有应用程序都能访问到相同的数据。 A数据可用性:任何时候,任何应用程序都可以读写…

C语言————结构体

接下来我们来了解C语言中很重要的内容:结构体。虽然到现在我们可以创建常量,变量,数组,但是存储的都是相同类型的数据,如果我们需要写入不同数据类型的信息怎么办,例如常见的身份证上的信息,有身…

小程序框架(概念、工作原理、发展及应用)

引言 移动应用的普及使得用户对于轻量级、即时可用的应用程序需求越来越迫切。在这个背景下,小程序应运而生,成为一种无需下载安装、即点即用的应用形式,为用户提供了更便捷的体验。小程序的快速发展离不开强大的开发支持,而小程…

这一步一步爬的伤痕累累

一、网安专业名词解释 ① CTF CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进…

yolov5v7v8目标检测增加计数功能--免费源码

在yolo系列中,很多网友都反馈过想要在目标检测的图片上,显示计数功能。其实官方已经实现了这个功能,只不过没有把相关的参数写到图片上。所以微智启软件工作室出一篇教程,教大家如何把计数的参数打印到图片上。 一、yolov5目标检测…

【物联网应用案例】智能农业应用案例

随着物联网 (IoT) 的广泛应用,各种互联设备已经深度融入我们的生活,涵盖了健康与健身、家庭自动化、物流运输以及智慧城市和工业物联网等多个领域。因此,将物联网、联网设备和自动化技术应用于农业,是十分符合时代发展需求的&…

求字符串所有整数最小和 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 1.输入字符串s输出s中包含所有整数的最小和,说明:1字符串s只包含a~z,A~Z,,-, 2.合法的整数包括正整数,一个或者多…

Mycat核心教程--Mycat 监控工具【四】

Mycat核心教程--Mycat 监控工具 九、Mycat 监控工具9.1.Mycat-web 简介9.2.Mycat-web 配置使用9.2.1.ZooKeeper 安装【上面有】9.2.2.Mycat-web 安装9.2.2.1.下载安装包9.2.2.2.安装包拷贝到Linux系统/opt目录下,并解压9.2.2.3.拷贝mycat-web文件夹到/usr/local目录…

QT摄像头采集

主界面为显示框&#xff0c;两个下拉框&#xff0c;一个是所有相机&#xff0c;一个是相机支持的分辨率 系统根据UI界面自动生成的部分不再描述&#xff0c;以下为其他部分源码 widget.h #include <QWidget> #include <QMouseEvent> class QCamera; class QCamer…

express+mysql+vue,从零搭建一个商城管理系统4--mysql数据库链接

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、创建express_service数据库二、安装mysql三、新建config文件夹四、新建config/db.js五、index.js引入db.js文件六、启动项目预览总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写service…

“智农”-农业一体化管控平台

大棚可视化|设施农业可视化|农业元宇宙|农业数字孪生|大棚物联网|大棚数字孪生|农业一体化管控平台|智慧农业可视化|智农|农业物联网可视化|农业物联网数字孪生|智慧农业|大棚三维可视化|智慧大棚可视化|智慧大棚|农业智慧园区|数字农业|数字大棚|农业大脑|智慧牧业数字孪生|智…

Presto简介、部署、原理和使用介绍

Presto简介、部署、原理和使用介绍 1. Presto简介 1-1. Presto概念 ​ Presto是由Facebook开发的一款开源的分布式SQL查询引擎&#xff0c;最初于2012年发布&#xff0c;并在2013年成为Apache项目的一部分&#xff1b;Presto 作为现在在企业中流行使用的即席查询框架&#x…