前端 TS 语法继承 多态 修饰符 readonly 抽象类 ts 基本写法 可选 剩余参数 函数重载 接口 类(3)

继承

继承之间的叫法
A类继承了B类,那么A类叫做子类,B类叫成基类
子类 ---》派生类
 基类 ---》超类(父类)

// 继承之间的叫法
// A类继承了B类,那么A类叫做子类,B类叫成基类
// 子类 ---》派生类
// 基类 ---》超类(父类)(() => {// 定义属性class Person {name: stringage: numbergender: stringconstructor(name: string,age:number,gender:string){this.name = namethis.age = agethis.gender = gender}// 定义实例方法sayHi(str:string){// ${str} 代表你是谁console.log(`我是:${this.name},${str}`)}}// 定义类 继承personclass Student extends Person{constructor(name: string,age:number,gender:string){super(name , age, gender)}sayHi() {console.log('wos')super.sayHi('jjjj')}}const person = new Person('da',89,'a')person.sayHi('kkk')const stu = new Student('sss',98,'jjj')stu.sayHi()
})()

多态

多态  : 父类型的引用指向子类型的对象,不同类型的对象针对相同的方法,产生不同的行为

// 多态  : 父类型的引用指向子类型的对象,不同类型的对象针对相同的方法,产生不同的行为
(() => {// 定义一个父类class Animak {// 定义属性name: string// 定义一个构造函数constructor(name: string) {// 进行赋值this.name = name}// 实例方法run(distance: number = 0) {// this.name  是每个类的名字console.log(`跑了${distance} 米`, this.name)}}// 定义一个子类class Dog extends Animak {// 定义构造函数constructor(name: string) {// 调用父类的构造函数,实现子类种属性的初始化操作,// 换句话说 继承了父类的属性  但是把原有的name换成自己的namesuper(name)}// 实例方法run(distance: number = 7) {console.log(`跑了${distance} 米`, this.name)}}// 定义一个子类class Pig extends Animak {constructor(name: string) {super(name)}run(distance: number = 40) {console.log(`跑了${distance} 米`, this.name)}}// 实例化父类对象const ani: Animak = new Animak('动物')// 实现run方法ani.run()// 实例化子类对象const dog: Dog = new Dog('大黄')// 实现run方法dog.run()// 实例化子类对象const pig: Pig = new Pig('八戒')// 实现run方法pig.run()console.log('====================================')// 实例化子类对象  他是通过继承父类的 进行实例化const dog1: Animak = new Dog('小黄')// 实现run方法dog1.run()// 实例化子类对象  他是通过继承父类的 进行实例化const pig1: Animak = new Pig('小猪')// 实现run方法pig1.run()console.log('====================================')// 该函数需要的参数Animak类型的function showRun(ani: Animak) {// 实现run方法ani.run()}// 实例化const dog2: Animak = new Dog('oo黄')// 实现run方法showRun(dog2)showRun(pig1)//都是继承父类的属性,在子类进行运行的,然后分别实现了子类的run方法
})()

 

修饰符

修饰符 主要描述类中的成员(属性,构造函数,方法)可访问性

 类中的成员都有自己的默认的访问修饰符

 public  默认修饰符  代表公共任何位置都可以访问

private 私有的修饰符号  类成员如果使用private来修饰,那么外部将无法访问内部数据,子类也无法访问数据

 protected 受保护修饰符 那么外部无法访问这个成员数据的,当然子类也可以访问


// // 修饰符 主要描述类中的成员(属性,构造函数,方法)可访问性
// // 类中的成员都有自己的默认的访问修饰符
// //  public  默认修饰符  代表公共任何位置都可以访问
// // private 私有的修饰符号  类成员如果使用private来修饰,那么外部将无法访问内部数据,子类也无法访问数据
// // protected 受保护修饰符 那么外部无法访问这个成员数据的,当然子类也可以访问
(()=>{// // 定义类// class Person{//     // 定义属性//    public name : string//     // 、定义构造函数 //    public constructor(name:string){//         // 更新属性//         this.name = name//     }//     // 定义方法//    public eat(){//         // 输出  this.name  当前名字//         console.log('输出',this.name)//     }// }// // 实例化// const per = new Person('大蛇丸')// // 输出per。name// console.log(per.name)// // 输出 per.eat// per.eat()// ------------------------------------------// 定义类class Person{// 定义属性protected name : string// 、定义构造函数 public constructor(name:string){// 更新属性this.name = name}// 定义方法public eat(){// 输出  this.name  当前名字console.log('输出',this.name)}}// 定义子类class Student extends Person{constructor(name:string){super(name)}play(){console.log('woxh',this.name)}}// 实例化const per = new Person('大蛇丸')// 输出per。name// console.log(per.name)// 输出 per.eatper.eat()const stu = new Student('hod')stu.play()
})()

 

readonly 

 readonly修饰符 修饰后 该成员的值 就不可以被外部随意修改 


// readonly修饰符 修饰后 该成员的值 就不可以被外部随意修改
(()=>{// // 定义类// class Person{//    readonly  name:string//     // 定义构造函数//     constructor(name:string){//         // 更新变量//         this.name = name//     }//     // 方法//     sayHi(){//         // 输出//         console.log("你好",this.name)//     }// }// // 实例化// const person:Person = new Person('小甜甜')// // 修改内容// // person.name = '大甜甜'  //readonly  不可以外部修改// // 打印person// console.log(person)// // 打印name// console.log(person.name)// --------------------------------------------------------class Person{// 构造函数中的name,一旦使用readonly进行修饰,// 那么person中就有name的属性成员,外部也是无法修改的name属性成员值// constructor(private name:string ='大甜甜'){//     this.name = name// }constructor(readonly name:string ='大甜甜'){this.name = name}// constructor(protected name:string ='大甜甜'){//     this.name = name// }}const person :Person = new Person('小甜甜')console.log(person)// person.name = '佐助'  readonly  不可以外部修改console.log(person.name)})()

抽象类 

抽象类 :包含抽象方法(抽象方法一般没有任何的具体内容的实现),
也可以包含实例方法,抽象类是不能实例化,为了让子类实例化,实现内部抽象的方法

 abstract  抽象类  定义之后,没有具体的方法  所以没有办法打印
 但是可以通过派生类(子类)进行继承来达到效果 在进行打印
也可以在定义属性的时候定义默认值  例子:  name: string= 'xiaohuang'

// // 抽象类 :包含抽象方法(抽象方法一般没有任何的具体内容的实现),
// // 也可以包含实例方法,抽象类是不能实例化,为了让子类实例化,实现内部抽象的方法// // abstract  抽象类  定义之后,没有具体的方法  所以没有办法打印
// // 但是可以通过派生类(子类)进行继承来达到效果 在进行打印
// // 也可以在定义属性的时候定义默认值  例子:  name: string= 'xiaohuang'
(()=>{// 定义抽象类abstract class Animak{// 定义抽象类 的属性abstract name :string// 定义抽象类的方法abstract eat()// 定义普通方法sayHi(){console.log('ninhao')}}// 定义派生类 (子类)class Dog extends Animak{// 继承父类的属性  并添加了默认值( name: string= 'xiaohuang')name: string= 'xiaohuang'// 继承父类的eat()方法 输出eat() {console.log('chi')}}// 实例化const dog :Dog = new Dog()// 派生类输出eat()方法dog.eat()// 调用的是抽象类中的实例化方法// 派生类输出父类的sayhi方法dog.sayHi()// 输出dog,nameconsole.log(dog.name)})()

ts 基本写法

// 可以把function 放在前边  也可以放在后边,的书写方式

// function 放前边 需要实例化  才行

// function 放后边 直接输出附带值 就可以

// :string  代表的是返回值  是什么类型的

(() => {// ts书写方法  字符串function add(x:string,y:string):string{return x+y}const res :string = add('11','22')console.log(res,' ts书写方法  字符串')
// ==========================================================// // ts书写方法  数字方法一function add1(x:number,y:number):number{return x+y}const res1 :number = add1(8,77)console.log(res1,'ts书写方法  数字方法一')
// ==========================================================//  // ts书写方法  数字方法二const add2=function(x:number,y:number):number{return x+y}console.log(add2(99,8),' ts书写方法  数字方法二')
})()

 

可选

// 可选参数 和默认参数

// ?表示可选参数  可以写  也可以不写 默认值

// firstName :string='东方' 默认参数

(()=>{//定义属性const getFullName = function (firstName :string='东方',lastName?:string):string{// 判断if(lastName){return firstName+ lastName}else{return firstName}}console.log(getFullName)console.log(getFullName('hzhsha'))console.log(getFullName('hzhsha','hdh'))
})()

 

剩余参数

 剩余的参数

 ...args: string[] 代表剩下的所有参数的属性都是str的类型

如果有两个或者属性,从第0开始计算,抛去已有的属性,剩下的才是  。。。args

(() => {function showRun(str: string,...args: string[]) {// 有多余的属性// function showRun(str: string, str2: string,...args: string[]) {console.log(str)  // a // console.log(str2)  // econsole.log(args) // ['e', 'eee', 'e', 'eee']}showRun('a', 'e', 'eee', 'e', 'eee')})()

 

函数重载

定义一个函数的时候,可能会遇见定义同名字的函数 写这个时候就是函数重载 了

(() => {// 函数重载   (名称相同了)function add (x:string,y:string):stringfunction add (x:number,y:number):numberfunction add(x:string|number,y:string|number):string|number {if(typeof x==='string'&& typeof y==='string'){return x+y}else if (typeof x==='number'&& typeof y==='number'){return x+y}return 'll' //因为报错缺少return  }console.log(add('主管', '不知道'))console.log(add(1022, 44))// console.log(add("1022", 44))})()

接口

 interface 定义接口

(()=>{// 定义一个默认接口interface IPerson{firstName :string //姓氏lastName : string //名字}// 输出姓名  (引用默认接口添加新的名称)function showFullName (person:IPerson){return person.firstName + "_"+ person.lastName}const person ={firstName :'懂法',lastName:'不到'}console.log(showFullName(person))})()

类的样式

(() => {// 定义接口interface IPerson {firstName: stringlastName: string}// 定义类型  这些就相当于默认值 谁都可以用class Person {// 、定义公共字段firstName: stringlastName: stringfullName: string// 定义构造器函数constructor(firstName: string, lastName: string) {// 更新数据值this.firstName = firstNamethis.lastName = lastNamethis.fullName = this.firstName+'-'+this.lastName}}// 从新定义函数 然后返回自己想要的类型 //可以从新定义一个函数  然后继承上边的接口类型function showFullName (person:IPerson){return person.firstName + '-' +person.lastName}// 实例化对象const person = new Person('诸葛','大壮')console.log(showFullName(person))})()

 

元组

一旦定义了数组类型 就必须用指定的类型 用其他类型 报错

let arr1 :number[] = [10,29,394,45]
console.log(arr1)  //[10, 29, 394, 45]// 数组定义方式2
let arr2 :Array<number> = [10,29,394,45]
console.log(arr2)   //[10, 29, 394, 45]// 元组
// 就是按照属性的数据 进行后边数据的类型进行对应  
let arr3 :[string,number,boolean] = ['天',2,true]
console.log(arr3)  //['天', 2, true]

 枚举

// // // enum 枚举的意思 枚举就是按照顺序输出 也可以获取索引值
enum Color {red = 5,green,blue
}
console.log(Color[1])  //red
console.log(Color.red)  //5

any 

 any类型  如果不确定当前类型的时候我们可以使用any类型

// // any类型  如果不确定当前类型的时候我们可以使用any类型
let str :any = 111114
console.log(str)  //111114let str1 :any = "111114"
console.log(str1)  //"111114"

 void类型

// // 表示没有返回值  没有return
function showRun():void{console.log('简单是') //"简单是"
}
console.log(showRun())   //undefined

 

联合数据

function getObj(str:number|string):number{// 获取数字长度return str.toString().length
}console.log(getObj("22211111111111111")) //17// // 就是可以在里边定义多个属性   返回字符串 
function getObja(str: number | string): string {//转换成字符串 return str.toString()
}
console.log(getObja("22211111111111111")) //22211111111111111

 

断言

 类型断言  也可以获取数字的长度   
(就是告诉编辑器我知道自己在干啥)
 断言方式1 (<string>str)

// // 类型断言  也可以获取数字的长度   
// // (就是告诉编辑器我知道自己在干啥)
// // 断言方式1 (<string>str)
function getStra(str:number|string):number{if((<string>str).length){return (<string>str).length}else{return str.toString().length}
}
console.log(getStra('22222')) //5
console.log('----------------------------')// 断言方式2  (str as string)
function getStr(str:number|string):number{if((<string>str).length){return (str as string).length}else{return str.toString().length}
}
console.log(getStr('2222222')) //7

 

set get   去值器

(()=>{
// 有报错  但是不影响输出class Person{firstName :stringlastName : stringconstructor(firstName:string,lastName:string){this.firstName = firstNamethis.lastName = lastName}get fullName(){return this.firstName + '-' + this.lastName}set fullName(val){let name = val.split('_')this.firstName = name[0]this.lastName = name[1]}}const person : Person = new Person('东方' , '大壮')console.log(person)  //Person {firstName: '东方', lastName: '大壮'}console.log(person.fullName)  //东方-大壮person.fullName = "诸葛_大壮"  //firstName: "诸葛"  lastName: "大壮"})()

 静态资源

静态资源无法正常通过方法进行访问


(()=>{// class Person {//     name : string//     age : string//     constructor(name:string ,age :string){//         this.name = name//         this.age = age //     }//     sayHi(){//         console.log('萨瓦迪卡')//     }// }// const person : Person = new Person('xiao','jjdl')// console.log(person.name)  //xiao// console.log(person.age)   //jjdl// person.sayHi() //萨瓦迪卡//     // --------------------------------
// // 静态资源无法正常通过方法进行访问
// // static  静态资源class Person{static name1:string = '天'constructor(){}static sayHi(){console.log('萨瓦迪卡')}}console.log(Person.name1) //天Person.name1 = '做主'console.log(Person.name1) //做主
})()

 

 函数类型  

通过接口的方式作为函数的类型使用 、

(()=>{// 定义接口interface ISearchFunc {// 定义接口值类型(source : string , subString : string) : boolean}// 创建函数  类型是上边的接口const searchString : ISearchFunc = function (source : string , subString : string) : boolean{// 返回的source字符串中查找subString 这个字符串有没有字  //  有就是true  没有就是falsereturn source.search(subString) > -1}// 有就是true  没有就是falseconsole.log(searchString('哈哈,年度十大' , '你')) //falseconsole.log(searchString('哈哈,年度十大' , '大')) //true
})()

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

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

相关文章

阅读笔记lv.1

阅读笔记 sql中各种 count结论不同存储引擎计算方式区别count() 类型 责任链模式常见场景例子&#xff08;闯关游戏&#xff09; sql中各种 count 结论 innodb count(*) ≈ count(1) > count(主键id) > count(普通索引列) > count(未加索引列)myisam 有专门字段记录…

计算机体系结构----缓存一致性/多处理机

本文严禁转载&#xff0c;仅供学习使用。参考资料来自中国科学院大学计算机体系结构课程PPT以及《Digital Design and Computer Architecture》、《超标量处理器设计》、同济大学张晨曦教授资料。如有侵权&#xff0c;联系本人修改。 本文衔接上文计算机体系结构----存储系统 …

python爬虫,验证码识别,携带cookies请求

古诗词网案例!!! 识别验证码类型: # 此处用到的图片验证码识别网址为:http://ttshitu.com/ 图鉴 import base64 import json import requests # 一、图片文字类型(默认 3 数英混合): # 1 : 纯数字 # 1001:纯数字2 # 2 : 纯英文 # 1002:纯英文2 # 3 : 数英混合 # 1003:…

用通俗易懂的方式讲解:大模型微调方法总结

大家好&#xff0c;今天给大家分享大模型微调方法&#xff1a;LoRA,Adapter,Prefix-tuning&#xff0c;P-tuning&#xff0c;Prompt-tuning。 文末有大模型一系列文章及技术交流方式&#xff0c;传统美德不要忘了&#xff0c;喜欢本文记得收藏、关注、点赞。 文章目录 1、LoRA…

轻松查看WiFi密码的神奇脚本,让你忘记密码也不再是问题

说在前面 &#x1f388;本文介绍了一个便捷的脚本&#xff0c;可以帮助你获取电脑中保存的所有Wi-Fi网络的密码。不再需要担心忘记Wi-Fi密码或手动查找密码的麻烦&#xff0c;只需运行脚本即可一键获取。 一、引言 互联网的普及让我们离不开Wi-Fi网络&#xff0c;但忘记密码时…

怎么安装es、kibana(单点安装)

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像&#xff0c;这个镜像体积非常大&#xff0c…

用C语言采集亚马逊amazon产品数据

上一篇文章我是用C写的一个爬取亚马逊的爬虫程序&#xff0c;相信大家已经看过了&#xff0c;这次呢&#xff0c;我依然使用C语言来写一个爬虫&#xff0c;大体上思路是和之前一样&#xff0c;只是支持的库以及语法有些区别&#xff0c;具体的呢我会一一解释出来&#xff0c;方…

android自定义来电秀UI

简单来电秀功能&#xff0c;效果如图&#xff1a; 底部附上demo 一、新建一个PhoneCallService服务&#xff0c;在服务中监听来电等状态&#xff0c;且控制UI显示 public class PhoneCallService extends InCallService {private final Call.Callback callback new Call.Ca…

仿真机器人-深度学习CV和激光雷达感知(项目2)day01

文章目录 前言项目介绍功能与技术简介硬件要求环境配置虚拟机运行项目demo 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;本文内容是我为复试准备的第二个项目 &#x1f4ab;欢迎大家的关注&#xff0c;我的博客主要关注…

如何给AI下达精准的指令,哪些提示词对于AI是有效的?

刚上手那会&#xff0c;我倾向于将 prompt 翻译为“指令”&#xff0c;但这并不精确。“指令”通常对应instructions&#xff0c;属于 prompt 中的纯指令部分&#xff0c;通常是一个动宾结构&#xff08;做什么&#xff09;。剩下的部分更多是描述&#xff08;describe&#xf…

stable-diffusion 学习笔记

从效果看Stable Diffusion中的采样方法 参考&#xff1a;Ai 绘图日常 篇二&#xff1a;从效果看Stable Diffusion中的采样方法_软件应用_什么值得买 大概示例&#xff1a;

Linux:信号

目录 1.信号 2.信号的过程 a.信号的产生 1:键盘产生, 异常产生 2:系统调用产生信号 3.软件条件产生信号 4.硬件异常产生信号 b.信号的发送 c.信号的处理 d.总结与思考 3.信号保存 1.信号及其它相关常见概念 2.在内核中的表示 3.sigset_t 4. 信号集操作函数 4.信…

Arduino开发实例-AS608光学指纹传感器驱动

AS608光学指纹传感器驱动 文章目录 AS608光学指纹传感器驱动1、AS608光学指纹传感器介绍2、硬件准备及接线3、代码实现3.1 指纹录入3.2 指纹匹配验证1、AS608光学指纹传感器介绍 AS608 光学指纹传感器可用于扫描指纹,它也可以通过串行通信将处理后的数据发送到微控制器。 所有…

gem5学习(12):理解gem5 统计信息和输出——Understanding gem5 statistics and output

目录 一、config.ini 二、config.json 三、stats.txt 官方教程&#xff1a;gem5: Understanding gem5 statistics and output 在运行 gem5 之后&#xff0c;除了仿真脚本打印的仿真信息外&#xff0c;还会在根目录中名为 m5out 的目录中生成三个文件&#xff1a; config.i…

【QT】QMessageBox 弹出消息框,对话确认框(确定/取消)

1.无互动 QMessageBox::information(nullptr,"信息","登陆成功");2.互动&#xff1a;确定、取消 QMessageBox::StandardButton box; box QMessageBox::question(this, "提示", "确定要添加吗?", QMessageBox::Yes|QMessageBox::…

RAG代码实操之斗气强者萧炎

&#x1f4d1;前言 本文主要是【RAG】——RAG代码实操的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#x…

Netty 介绍、使用场景及案例

Netty 介绍、使用场景及案例 1、Netty 介绍 https://github.com/netty/netty Netty是一个高性能、异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可扩展的网络服务器和客户端。它是一个开源项目&#xff0c;最初由JBoss公司开发&#xff0c;现在由社区维护。Netty的…

企业网络出口部署案例

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…

myql进阶-一条查询sql在mysql的执行过程

目录 1. 流程图 2. 各个过程 2.1 连接器 2.2 分析器 2.3 优化器 2.4 执行器 2.5 注意点 1. 流程图 2. 各个过程 假设我们执行一条sql语句如下&#xff1a; select * from t_good where good_id 1 2.1 连接器 首先我们会和mysql建立连接&#xff0c;此时就会执行到连接…

C++20结构化绑定应用实例(二百五十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…