1.什么是类?
我们从小到大都听到很多关于类的词语,比如植物类、动物类、微生物类、显而易见我们知道它们是有区别,且它们内部又有共同的一些基础特征,比如说:
猫类:皮毛颜色、猫叫;那你可能会想到对象,比如定义一只加菲猫:皮毛颜色:棕色
那么你会说那加菲猫也有这样的属性,那她是类吗?
2.区分类和对象
类是抽象的,它描述了一些属性和方法,比如猫类
对象是具体的,你也可以理解为它引申于类,比如加菲猫
3.如何创建类?
在es5中,其实我们是没有类的概念的,我们使用构造函数、原型链继承
es6中使用class
3.1构造函数方式
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.....其实还有工厂模式、原型加构造函数等,这里就不一一说明了
3.4class
class Cat {
name: string;
fur: string;
//需要构造函数初始化
constructor(name: string, fur: string) {
this.name = name;
this.fur = fur;
}
miao () {
//this访问的是类的成员
console.log('我叫'+this.name+',我的毛发颜色是'+this.fur+',喵喵喵~')
}
}
let myCat = new Cat('mini','yellow')
myCat.miao()
4.继承
什么是继承?从字面理解就是可以能获取一部分的东西,好比如说继承财产,但是这个东西我们在类中指的是属性和方法;
子类(派生类):继承人
基类(超类):被继承人
MINI 继承了车类的move函数,实例minicooper这个对象,注意派生类MINI在使用constructor函数时,要使用super,
他会执行基类的构造函数,在使用this之前,必须调用super()
而且在派生类中我们重写了move函数,这使得当我们定义了更多的派生类是,可根据需求重写该方法
class Car {
move (distance: number) {
console.log('行驶了'+distance+'公里')
}
}
class MINI extends Car {
speed: number;
constructor(speed: number) {
//注意:派生类使用constructor时,要使用super
super()
this.speed = speed
}
move (distance: number) {
console.log('速度为'+distance+'公里每小时')
}
}
let minicooper = new MINI(300)
minicooper.move(3000)
5.公共public,私有private与受保护protected的修饰符,默认都是public
总结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总结:protected与private很像,但是还是有区别,它可以在派生类访问,
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只读属性:必须在声明时或构造函数里被初始化
class Cat {
readonly name: string
constructor(name: string) {
this.name = name
}
bark () {
console.log(this.name)
}
}
let miao = new Cat('叮当')
console.log(miao.name)//叮当
miao.name = '杰瑞'//无法分配到“name”,因为她是常数或只读属性