[TS基础]对象,类,属性

10,621次阅读
没有评论

共计 3234 个字符,预计需要花费 9 分钟才能阅读完成。

对象, 类与属性

  • 一. 类 (class)
    • 1. 属性与方法
    • 2. 构造器
    • 3. 继承
    • 4.super 关键字
  • 二. 抽象类与抽象方法
  • 三. 接口
  • 四. 属性的封装
  • 五. 泛型
  • 笔记说明

一. 类 (class)

  • 类可以理解为对象的模型, 通过类来创建对象

1. 属性与方法

  • 一个类主要包含两个部分, 属性与方法


class Person {
    
    static id: number = 9527;
    
    name: string = "iFinder";
    age: number = 24;
    
    readonly country:string = "china";

    
    
    sayGood() {
        console.log("Good !");
    }
}

const per = new Person();
per.sayGood();
console.log(per.name);
console.log(per.age);

console.log(Person.id);

2. 构造器

  • 创建多个对象的时候, 我们希望在创建对象时就赋予它不同的属性, 这时就可以通过构造器来实现这样的需求
class Dog {
    name: string
    age: number
    
    constructor(name: string, age: number) {
        
        this.name = name
        this.age = age
    }
    bark() {
        alert('汪 !')
    }
}

class Cat {
    
    constructor(public name:string, public age:number) {

    }
}

const dog1 = new Dog('dog1', 4)
const dog2 = new Dog('dog2', 5)
const dog3 = new Dog('dog3', 6)
console.log(dog1)
console.log(dog2)
console.log(dog3)

3. 继承

  • 可以通过继承, 将多个类共有的属性与方法抽象出来, 作为公共的父类. 这样可以大大提高代码的利用率
  • 子类直接继承父类, 可以直接拥有父类的属性与方法
(function(){
    
    
    class Animal {
        name: string 
        age: number
        constructor(name: string, age: number){
            this.name = name
            this.age = age
        }
        sayHello() {
            console.log(`${this.name} 在 叫 !`)
        }
    }

    
    
    class Dog extends Animal {
        
        run() {
            console.log(`${this.name} 在 跑!`)
        }
        
        
        sayHello() {
            console.log(`${this.name} 在 汪汪汪 !`)
        }
    }
    class Cat extends Animal {
        sayHello() {
            console.log(`${this.name} 在 喵喵喵 !`)
        }
    }
    const dog = new Dog('小黑狗', 4)
    const cat = new Cat('小花猫', 6)
    dog.sayHello()
    cat.sayHello()
})()

4.super 关键字

  • 子类继承父类之后, 如果想调用父类中的属性或者方法, 可以通过 super 关键字
  • 子类如果重新实现了构造器, 那么需要在自己的构造器中通过 super 调用父类的构造器
(()=>{
    class Animal {
        name: string
        constructor(name:string) {
            this.name = name
        }
        sayHello() {
            console.log("动物叫")
        }
    }

    class Dog extends Animal {
        age: number
        
        constructor(name:string, age:number) {
            super(name)
            
            this.age = age
        }
        sayHello() {
            
            
            super.sayHello()
        }
    }

    const dog = new Dog('小黑', 8)
    dog.sayHello()
})()

二. 抽象类与抽象方法

  • 当你定义了一个公共父类, 并且只想被继承, 不想拥有具体实例的时候就可以通过 abstract 修饰, 使之成为抽象类
  • 抽象类中你想定义子类必须实现的某些方法, 可以定义抽象方法
(()=>{
    
    abstract class Animal {
        name: string
        constructor(name:string) {
            this.name = name
        }

        
        
        abstract sayHello(): void
    }

    class Dog extends Animal {
        
        sayHello(): void {
            console.log(`${this.name} 在 汪汪汪 !`)
        }
    }
    const dog = new Dog('小黑')
    dog.sayHello()
})()

三. 接口

(()=>{
    
    type myType = {
        name: string,
        age: number
    }

    
    interface myInterFace {
        name: string
        age: number
    }

    
    interface myInterFace {
        gender: string
    }

    
    interface inter{
        name: string
        sayHello(): void
    }

    
    class MyClass implements inter {
        name: string = "iFinder"
        sayHello(): void {
            
        }
    }
})()

四. 属性的封装

  • TS 的类中的属性, 如果不加以修饰的话就是任何人都能访问与修改的, 这样就造成的属性数据的不安全
  • 通过封装, 可以将属性一定程度上的保护起来
  • 封装后只提供给调用方相应的方法, 这样设置与获取数据的方法就是开发者可控的, 提高了数据的安全性
(()=>{
    
    class Person {
        
        private _name:string
        private _age:number

        constructor(name:string, age:number) {
            this._name = name
            this._age = age
        }

        
        getName():string {
            return this._name;
        }
        
        setName(name:string) {
            this._name = name;
        }
        
        setAge(age:number) {
            if(age >= 1) {
                this._age = age;
            }
        }

        
        get age():number {
            return this._age >= 1 ? this._age : 1;
        }
        set age(age:number) {
            if(age >= 1) {
                this._age = age;
            }
        }
    }

    
    const p = new Person("iFinder", 25);
    console.log(p.age);  
    p.age = -1;  
    console.log(p.age);  
})()

五. 泛型

  • 定义函数或者声明一个类的时候如果暂时不能确定具体的类型, 但是又想保持某种类型的统一, 不想通过 any 破环 TS 的类型检查机制, 就可以通过指定泛型的方式来达到这个要求
(()=>{
    
    function fnV>(a: V): V {
        return a;
    }

    
    let a:number = fn(10)
    
    let s:string = fnstring>('iFinder')

    
    function fn1K, T>(a: T, b: K): T {
        return a;
    }

    
    interface Inter{
        length:number
        getLength(): number
    }
    abstract class Animal {
        info:string;
        constructor(private _name:string, private _age:number) {
            this.info = `name: ${_name}, age: ${_age}`
        }
        get name(){
            return this._name
        }
        set age(age:number) {
            this._age = age
        }
    }

    function fn2T extends Inter, K extends Animal>(a: T, b: K): K {
        return b
    }

    
    class MyClassT>{
        constructor(public name:T) {}
    }
    
    let my = new MyClassstring>("iFinder")
})()

笔记说明

笔记 markdown 文件 + 项目源码
B 站对应视频

原文地址: [TS 基础] 对象, 类, 属性

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-10-07发表,共计3234字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)