在面向?qū)ο笳Z言中,類是一種面向?qū)ο笥?jì)算機(jī)編程語言的構(gòu)造历造,是創(chuàng)建對象的藍(lán)圖,描述了所創(chuàng)建的對象共同的屬性和方法闹炉。class
1诡必、基本示例
class Person {
// 聲明屬性
name: string
// 構(gòu)造方法
constructor(name: string) {
this.name = name;
}
// 一般方法
sayHi() {
console.log(`hello ${this.name}`);
}
}
// 創(chuàng)建類的實(shí)例
let person = new Person('李四');
// 調(diào)用實(shí)例的方法
person.sayHi();
2奢方、靜態(tài)屬性
只能通過類訪問的屬性或方法。
class Person {
name: string = '張三'
static age: number = 18
constructor() {
console.log(this.age); // 報(bào)錯(cuò)
console.log(Person.age); // 18
}
sayHi() {
console.log(`hello ${this.name}`);
}
}
let p1 = new Person();
console.log(Person.age); // 18
3爸舒、類修飾符
- public 公有的 屬性不添加修飾符默認(rèn)為公有的 可以在任何地方被訪問
- private 私有的 不能在聲明它的類的外部訪問
- protected 受保護(hù)的 和privite類似 區(qū)別是它的子類中是允許訪問的
- readonly 將屬性設(shè)置為只讀狀態(tài) 不可更改
3.1蟋字、示例
class Person {
public name: string
private age: number
protected sex: string
constructor(name: string, age: number, sex: string) {
this.name = name;
this.age = age;
this.sex = sex;
}
sayHi() {
console.log(`hello ${this.name}`);
}
}
let p = new Person('張三', 18, '男');
console.log(p);
console.log(p.age); // 報(bào)錯(cuò) 私有屬性 只能在類中被訪問
console.log(p.sex); // 報(bào)錯(cuò) 受保護(hù)的 只能在類中或子類中被訪問
當(dāng)構(gòu)造函數(shù)的修飾符是private時(shí),該類不允許被繼承或者實(shí)例化扭勉。
class Person {
public name: string
private constructor(name: string) {
this.name = name;
}
sayHi() {
console.log(`hello ${this.name}`);
}
}
let p = new Person('張三'); // 報(bào)錯(cuò) 構(gòu)造函數(shù)是類私有的 只能在類中訪問
當(dāng)構(gòu)造函數(shù)的修飾符是private時(shí)鹊奖,該類不允許被繼承或者實(shí)例化。
class Person {
public name: string
protected constructor(name: string) {
this.name = name;
}
sayHi() {
console.log(`hello ${this.name}`);
}
}
class Son extends Person{
constructor(name: string) {
super(name);
}
}
let p = new Person('張三'); // 報(bào)錯(cuò) 構(gòu)造函數(shù)是受保護(hù)的 只能在類中訪問
let son = new Son('張三');
3.2涂炎、readonly
class Person {
readonly name: string
constructor(name: string) {
this.name = name;
}
sayHi() {
console.log(`hello ${this.name}`);
}
}
let p = new Person('張三');
p.name = '李四'; // 報(bào)錯(cuò) name是只讀屬性
readonly 可以在構(gòu)造函數(shù)中被更改
class Person {
readonly name: string = '張三'
constructor(name: string = '李四') {
this.name = name;
}
sayHi() {
console.log(`hello ${this.name}`);
}
}
let p = new Person();
console.log(p.name); // 李四
let p1 = new Person('王五');
console.log(p1.name); // 王五
3.3忠聚、參數(shù)屬性
構(gòu)造函數(shù)中的參數(shù) 一旦使用修飾符后 類中就多了一個(gè)屬性 這叫做參數(shù)屬性
class Person {
constructor(readonly name: string = '李四') {
}
sayHi() {
console.log(`hello ${this.name}`);
}
}
let p = new Person();
console.log(p.name); // 李四
4、存取器
讓我們可以有效的控制對對象中成員的訪問 通過getters和setters來實(shí)現(xiàn)唱捣。
class Person {
firstName: string = 'A'
lastName: string = 'B'
get fullName () {
return `${this.firstName}_${this.lastName}`;
}
set fullName (value) {
let arr = value.split('-');
this.firstName = arr[0];
this.lastName = arr[1];
}
}
let p = new Person();
console.log(p.fullName); // A_B
p.fullName = 'A-C';
console.log(p.fullName); // A_C
5两蟀、繼承 extends
繼承是一種聯(lián)結(jié)類與類的層次模型。指的是一個(gè)類繼承另外的一個(gè)類的功能爷光,并可以增加新功能的能力,繼承是類與類或者接口與接口之間最常見的關(guān)系澎粟。
class Person {
name: string
age: number
sex: string
constructor(name: string = 'jack', age: number = 18, sex: string = '男') {
this.name = name;
this.age = age;
this.sex = sex
}
sayHi(str: string = 'and you?') {
console.log(`姓名:${this.name}-年齡:${this.age}-性別:${this.sex} ${str}`);
}
}
class Son extends Person {
constructor(name: string, age: number, sex: string) {
super(name, age, sex);
}
}
let persons = new Person();
let son = new Son('jack1', 20, '男');
persons.sayHi();
son.sayHi(); // 繼承父類里的sayHi方法
6蛀序、多態(tài)
父類型的引用指向了子類型的對象欢瞪,不同類型的對象針對相同的方法,產(chǎn)生了不同的行為徐裸。
class Animal {
name: string
constructor(name: string = '小花貓') {
this.name = name;
}
eat(food: string = '魚') {
console.log(`${this.name}---${food}`);
}
}
class Dog extends Animal {
constructor(name: string) {
super(name);
}
eat(food: string = '骨頭') {
console.log(`${this.name}---${food}`);
}
}
class Pig extends Animal {
constructor(name: string) {
super(name);
}
eat(food: string = '大白菜') {
console.log(`${this.name}---${food}`);
}
}
let ani: Animal = new Animal();
ani.eat();
let dogs: Dog = new Dog('阿黃');
dogs.eat();
let pigs: Pig = new Pig('天蓬元帥');
pigs.eat();
let dogs1: Animal = new Dog('阿黃');
dogs.eat();
let pigs1: Animal = new Pig('天蓬元帥');
pigs.eat();
function getEat(ani: Animal) {
ani.eat();
}
getEat(dogs1);
getEat(pigs1);
7遣鼓、抽象類 abstract
抽象類做為其它子類的基類使用。它們不能被實(shí)例化重贺,因?yàn)樗锩姘粋€(gè)或多個(gè)抽象方法骑祟。所謂的抽象方法,是指不包含具體實(shí)現(xiàn)的方法气笙。抽象類中的抽象方法必須在子類中實(shí)現(xiàn)次企。
abstract class Animal {
abstract cry()
run() {
console.log('run');
}
}
let ani = new Animal(); // 報(bào)錯(cuò)
抽象類不允許被實(shí)例化,只能在子類中實(shí)現(xiàn)抽象方法
abstract class Animal {
abstract cry()
run() {
console.log('run');
}
}
class Dog extends Animal {
cry() {
console.log('dog cry');
}
}
let dog = new Dog();
dog.cry();
dog.run();