ArkTS基础语法(下)

最近有些懒惰,总充斥这我的脑袋,总在挣扎的边缘哈哈

言归正传,继续学习

语句

条件语句

用于基于不同的条件来执行不同的动作,根据判断条件的执行结果(Ture或false)来决定执行的代码块。

let isValid: Boolean = false;
if(Math.random() > 0.5){
    isValid=true;
} else{
    isValid=false;
}

上面的例子中Math.random( )是生成0-1的随机数的内置math库的函数,这里根据其返回的结果,是否大于0.5,来给isValid进行赋值。

对于isValid的赋值,也可以使用条件表达式的方式,替换条件语句,如下:

let isValid = Math.random() > 0.5 ? ture : false;

循环语句

是一种重复执行一组语句的结构,能够提高效率和简化代码,例如下面要打印这个数组的内容:

let students:string[]=['Xiaoming','Jack','Mary'];
for循环语句
for(let i =1;i<students.length;i++){
    console.log(students[i]);
}
for of语句
for(let student of students){
    console.log(student);
}
while语句
let index=0;
while(index<students.length){
    console.log(students[index]);
    index++;
}

以上都可以进行输出数组中人物的姓名

函数的声明和使用

function函数

函数是一组一起执行多条语句的组合,形成可重用的代码块。

通过function关键字告诉编辑器声明函数的名称,返回类型和参数以及执行内容;

function()函数名(参数列表):返回类型{

        函数体

}

一般用来定义特殊的任务或者操作,下面是通过函数来接受students的输入,只要在调用时传入不同的参数,就能执行打印不同的信息。

function printStudentsInfo(students:string[]):void{
    for(let student of students){
        console.log(student);
    }
}

printStudentsInfo(['Xiaoming','Xiaozhang','Xiaoliang'])
printStudentsInfo(['Xiaoming','Xiaohong'];)
箭头函数

箭头函数又叫做lambda表达式,可以用来简化函数的声明,通常用于一个需要简单函数的地方,箭头函数使用等于加大于连接参数。

( 参数列表 ): 返回类型 => { 函数体 }

箭头函数的返回类型可以省略,省略时,返回类型通过函数体来进行判断,在执行体只有一行的时候,可以省略花括号,并且,也可以将箭头函数赋值给一个变量,例如printInfo

const printInfo=(name:string):void=>{console.log(name)};

//一行可以省略花括号
const printInfo=(name:string):void=>console.log(name);
printInfo('Xiaoming');

大多时候,箭头函数用于作为回调函数使用,例如下面的代码块,在数组的forEach方法中,传入一个箭头函数,用于遍历时的操作。

let students:string[]=['Xiaoming','Xiaolan','Xiaohong'];
students.forEach((student:string)=>console.log(student));

闭包函数

闭包是函数式编程里面的一个有用的工具,通过闭包,创建一个函数并返回,可以保留对内部作用域的访问,如下面的例子:

function outerFunc():()=>string{
    let count=0;
    return():string=>{
    count++;
    return count.toString()
    }
}

let invoker = outerFunc()
console.log(invoker()) //输出1
console.log(invoker()) //输出2

在这个例子中,outerFunc的返回值是一个函数类型,在结果中返回了一个箭头函数,通过invoker接受了outerFunc( )的执行结果,invoker函数就保留了对count的访问,每次执行invoker函数的时候,都可以直接访问到count的值,如果在多个地方都可以用到,就可以使用type,对返回的函数类型取一个类型别名,方便后续的管理,如下:

type returnType = () =>string;             //使用该类型作为返回类型

function outerFunc():()=>returnType{       //声明一个函数类型
    let count=0;
    return():string=>{
    count++;
    return count.toString()
    }
}

let invoker = outerFunc()
console.log(invoker()) //输出1
console.log(invoker()) //输出2

类的声明和使用

类的声明,ArkTS支持基于类的面向对象的编程方式,定义类的关键字为class,后面紧跟类名。类的声明描述了所创建的对象共同的属性和方法。

可以将一个东西抽象化为一个类,之后用new关键字实例化出一个对象,并且通过点运算符的方式访问这个对象的属性,也可以通过字面量的方式进行创建

class person{
    name:string='Xiaoming';
    age:number=18;
    isMale:boolean=true;
}

const person=new Perple();                                   //new实例
console.log(person.name);

const person:Person = {name:'Xiaoming',age:18,isMale:true};   //字面量
console.log(person.name);          //输出Xiaoming

构造器,如果要实例化出不同的对象内容可以自定义constructor,在 constructor中,给对应的属性传入初值,那么在new的时候只需要传入接收到的参数就可以创造出不同的实例对象。

class person{
    name:string='Xiaoming';
    age:number=18;
    isMale:boolean=true;


    constructor(name:string,age:number,isMale:boolean){
    this.name=name;
    this.age=age;
    this.isMale=isMale;
    }
}

const person =new Person('Xiaozhang',32,false); //通过传入参数实体化
console.log(person.name)

一个人,除了有自身的属性外,还可以执行一些行为,例如他可以进行自我介绍,对应到代码中就是类的方法这里定义一个printInfo方法来打印自身的信息,调用时,通过person.printInfo的方式实行对应实例的方法:

class person{
    name:string='Xiaoming';
    age:number=18;
    isMale:boolean=true;


    constructor(name:string,age:number,isMale:boolean){
    this.name=name;
    this.age=age;
    this.isMale=isMale;
    }
    
    printInfo(){
    if(this.isMale){
    console.log('${this.name}is a boy,and he is $[this.age}years old');
    }else{
    console.log('${this.name}is a girl,and he is $[this.age}years old');
    }
   } 
}

const person =new Person('Xiaozhang',28,true); //通过传入参数实体化
person.printInfo( )         //Xiaozhang is a boy,and he is 28 years old.

ArkTS支持面向对象的编程方式,那么就有面向对象的三大特征:封装,继承和多态

封装

封装是将数据和操作组合到一起,形成一个相对独立的实体,通过封装可以将数据隐藏起来,只对外部提供必要的接口来访问和操作数据,以保证数据的一致性和安全性。例如下面的:

class person{
   public name:string='Xiaoming';
   private _age:number=18;
    isMale:boolean=true;
    ...省略构造器和方法内容
    get age():number{
        return this._age;
    }

    set age():number{
        this._age=age;
    }
}

const person:Person=new Person('Xiaoming',18,ture);

console.log(person._age.toString())  //无法访问私有属性
console.log(person.age.toString())   //实际访问的是get方法

可以通过private修饰一个私有年龄,私有变量是无法通过对象直接访问的,访问只能通过getter或者自定义方法进行,那么这样就只暴露了接口,进行访问和操作数据,修改和访问时,则需要触发getter或者setter函数。

继承

继承是一种建立在现有类型上创建新类的机制,通过继承,子类可以继承并重用父类的属性和方法,从而减少重复代码,实现了代码的复用和层次化设计,继承使用extends关键字,例如一个员工也有人的特征,就可以用extends进行继承,在构造器中通过super来执行父类的构造方法那么Employee这个类也就具有了Person的基本属性,并且也具备了printInfo的方法,如下:

class Employee extends Person{
    department : string;

    constructor(name : string , age : number , isMale : boolean , department : string){
        super(name, age, isMale);   //通过super关键字访问父类
        this.department=department;
    }
}

const employee : Employee = new Employee('Xiaohong',28,ture,'xxCompany');
employee.printInfo();     //输出:Xiaohong is a boy,and he is 28 years old.子类继承父类的方法

通过实例化的Employee的对象,直接调用printInfo方法就可以打印出对应的信息。

多态

多态常常和继承一起,表示子类继承父类,并且重写父类方法,那么父类和子类的实例对象,在同一行为下就有不同的表现,例如Employee这个类,它重写了父类person的printInfo方法,其在方法中通过调用super实行了父类的printInfo方法,并额外执行了属于自己特有的行为,那么实例化后的Person和Employee在相同的行为下,就有了不同的表现,这就是多态的体现,如下:

class Employee extends Person{
    department : string;

    constructor(name : string , age : number , isMale : boolean , department : string){
        super(name, age, isMale);   //通过super关键字访问父类
        this.department=department;
    }
    
    public printInfo():string{                          //重写父类的方法
        super.printInfo();
        console.log('working in ${this.department}');
    }
}

const person:Person=new Person('Xiaohong',28,true);
person.printInfo(); //输出Xiaohong is a boy,he is 8 years old.

const employee : Employee = new Employee('Xiaohong',28,ture,'xxCompany');
employee.printInfo();     //输出:Xiaohong is a boy,and he is 28 years old,working in xxCompany.

接口的声明和使用

接口

接口是用来约束和规范类的方法,提高开发效率的工具,接口在程序设计中具有很重要的作用。

接口的声明

在 ArkTS中,我们可以通过interface关键字来声明接口,在接口中可以声明属性,也可以声明方法,但是不需要给属性具体得值和方法 给出对应的实现     

interface AreaSize{
    width:number;        //声明属性
    height:number;       //属性 2 
}

interface AreaSize{
    calculateAreaSize():number;   //方法的声明
    someMethod():void ;           //方法的声明
}
接口的使用
let area:AreaSize = {width: 100, height: 100};

对于只有属性的接口,可以通过字面量的方式创建对象实例,而如果接口中声明的方法,就无法通过字面量的方式来创建 。

接口的实现

在开发中,我们可以通过使用implements关键字,对接口进行实现,实现中必须遵循接口所约定的属性和方法,保持相同的名称,并且对接口中的声明的方法进行具体的实现

interface AreaSize{
    width:number;        //声明属性
    height:number;       //属性 2 

    calculateAreaSize():number;    //方法的声明
    someMethod():void;             //法方的声明           实现接口中约定的方法
}

//接口实现
class RectangleSize implements AreaSize{
    width:number=0;
    height:number=0;
    
    someMethod():void{                                    //实现接口中约定的方法
        console.log('someMethod called');
}

    calculateAreaSize():number{
        this.someMethod();
        return this.width * this.height;
    }
}

  

模块导入和导出

在实际开发中,我们可能在多个文件中进行开发,如果在多个模块中进行开发,那么就要了解模块的概念。

模块的定义

在应用开发中,我们会将代码拆分到多个文件,这样更加有利于开发的维护和管理,在ArkTS中,一个文件就可以是一个模块由于不同文件之间的作用域是隔离的,一个文件,如果想要引入其它文件中的函数类或者变量,就需要使用export和import关键字,来进行模块的导入或者导出。

例如下面的例子,刚刚定义的person类,我们需要在其他文件中引用这个类,首先就要在这个类的前面加一个修饰符export 

export class Person{                //导出所需要的类
    name:string='Xiaoming';
    age:number=18;
    isMale:boolean=true;

    ...省略构造器内容    
    printInfo(){
    if(this.isMale){
    console.log('${this.name}is a boy,and he is $[this.age}years old');
    }else{
    console.log('${this.name}is a girl,and he is $[this.age}years old');
    }
   } 
}

在另一个文件中通过impot的方式,从对应文件路径引入导入的Person类,这样就可以使用Person这个类了,在开发中合理使用模块的导入和导出,可以实现代码的复用和组合,能够提高编码效率。

import { Person } from './Person'
const person = new Person('Xiaozhang',20,true);
person.printInfo(); //输出Xiaozhang is a boy,he is 20 years old.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九离十

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值