1.什么是類?
我們從小到大都聽到很多關(guān)于類的詞語,比如植物類、動(dòng)物類、微生物類、顯而易見我們知道它們是有區(qū)別,且它們內(nèi)部又有共同的一些基礎(chǔ)特征,比如說:
貓類:皮毛顏色、貓叫;那你可能會(huì)想到對象,比如定義一只加菲貓:皮毛顏色:棕色
那么你會(huì)說那加菲貓也有這樣的屬性,那她是類嗎?
2.區(qū)分類和對象
類是抽象的,它描述了一些屬性和方法,比如貓類
對象是具體的,你也可以理解為它引申于類,比如加菲貓
3.如何創(chuàng)建類?
在es5中,其實(shí)我們是沒有類的概念的,我們使用構(gòu)造函數(shù)、原型鏈繼承
es6中使用class
3.1構(gòu)造函數(shù)方式
function Obj(){
this.name="vicky";
this.say=function(){
alert("我是vicky");
};
}
var obj1=new Obj();
console.log(obj1.name)
3.2原型鏈
function Obj(){
}
Obj.prototype.name="vickyfan";
Obj.prototype.say=function(){
alert("vickyfan");
}
var obj1=new Obj();
console.log(obj1.name)
3.3.....其實(shí)還有工廠模式、原型加構(gòu)造函數(shù)等,這里就不一一說明了
3.4class
class Cat {
name: string;
fur: string;
//需要構(gòu)造函數(shù)初始化
constructor(name: string, fur: string) {
this.name = name;
this.fur = fur;
}
miao () {
//this訪問的是類的成員
console.log('我叫'+this.name+',我的毛發(fā)顏色是'+this.fur+',喵喵喵~')
}
}
let myCat = new Cat('mini','yellow')
myCat.miao()
4.繼承
什么是繼承?從字面理解就是可以能獲取一部分的東西,好比如說繼承財(cái)產(chǎn),但是這個(gè)東西我們在類中指的是屬性和方法;
子類(派生類):繼承人
基類(超類):被繼承人
MINI 繼承了車類的move函數(shù),實(shí)例minicooper這個(gè)對象,注意派生類MINI在使用constructor函數(shù)時(shí),要使用super,
他會(huì)執(zhí)行基類的構(gòu)造函數(shù),在使用this之前,必須調(diào)用super()
而且在派生類中我們重寫了move函數(shù),這使得當(dāng)我們定義了更多的派生類是,可根據(jù)需求重寫該方法
class Car {
move (distance: number) {
console.log('行駛了'+distance+'公里')
}
}
class MINI extends Car {
speed: number;
constructor(speed: number) {
//注意:派生類使用constructor時(shí),要使用super
super()
this.speed = speed
}
move (distance: number) {
console.log('速度為'+distance+'公里每小時(shí)')
}
}
let minicooper = new MINI(300)
minicooper.move(3000)
5.公共public,私有private與受保護(hù)protected的修飾符,默認(rèn)都是public
總結(jié)5.1:public不受限,private只能在該類中使用
class Cat {
private name: string
constructor(name: string) {
this.name = name
}
bark () {
console.log(this.name)
}
}
let miao = new Cat('miao')
miao.bark()
console.log(miao.name)//屬性“name”為私有屬性,只能在類“Cat"中訪問
5.2總結(jié):protected與private很像,但是還是有區(qū)別,它可以在派生類訪問,
class Cat {
protected name: string
constructor(name: string) {
this.name = name
}
bark () {
console.log(this.name)
}
}
class MI extends Cat {
constructor(name: string) {
super(name);
}
move () {
console.log('我在跑步')
}
}
let miao = new Cat('miao')
let miao1 = new MI('hahha')
miao.bark()
6.readonly只讀屬性:必須在聲明時(shí)或構(gòu)造函數(shù)里被初始化
class Cat {
readonly name: string
constructor(name: string) {
this.name = name
}
bark () {
console.log(this.name)
}
}
let miao = new Cat('叮當(dāng)')
console.log(miao.name)//叮當(dāng)
miao.name = '杰瑞'//無法分配到“name”,因?yàn)樗浅?shù)或只讀屬性