# 面向对象特性
* **类**
类事TypeScript的核心,使用TypeScript开发时,大部分代码都是些在类里面的。
类的定义,构造函数,以及类的继承
类的定义
![](https://img.kancloud.cn/93/9b/939bd5663cdc25bbaeee06384a6cfa32_844x339.png)
类的构造函数 constructor
![](https://img.kancloud.cn/02/17/0217bcd5cced20d128b4f320f7c5a3fe_418x333.png)
实例化的时候 必须声明规则
![](https://img.kancloud.cn/bb/81/bb815f479b0c641e575242a3af5fadda_436x332.png)
等同于
![](https://img.kancloud.cn/37/fa/37fa549c2e1543e024a57e92b578278f_824x271.png)
>注:在构造函数 constrector 中 参数声明需要带public 如果不带public 则此类中 没有声明此属性 类中就无法调用name
*****
extends 继承另一个类
![](https://img.kancloud.cn/64/4e/644e7e0994488096755b6344df08315a_371x285.png)
![](https://img.kancloud.cn/69/6b/696bfb4b497d1124454f880b3de13bc8_400x181.png)
子类的构造函数必须调用父类
super 用于实现子类调用父类的构造函数
![](https://img.kancloud.cn/a9/f5/a9f5cdcfdaa8bf767e4a634d8d0ac46f_380x296.png)
~~~
class Person{
name: string;
age: number;
constructor(public food:string = 'pig'){
}
eat(){
console.log(`人要吃${this.food}`);
}
}
class Gooder extends Person{
constructor(public job:string ,public food = '肉肉'){
super(food);
}
say(){
console.log(`ta说要好好干活,我是做${this.job}工作的`);
};
sleep = () => {
super.eat();
this.kiss();
console.log('好了 去睡觉');
};
kiss = () => {
console.log('睡觉前,需要亲吻家人');
}
}
var a = new Person();
a.eat();
var b = new Gooder('教师');
b.say();
b.sleep();
~~~
> 注:在编写代码时,我在类中使用了箭头函数的写法,发现在继承类调用时,不可以使用,故此我发现,箭头函数的权限为private
*****
* **泛型**
参数化的类型,一般用来限制集合的内容
~~~
var worker: Array<Person> = [];
worker[0] = new Person();
worker[1] = new Gooder('宇航员');
console.log(worker);
~~~
一下截图为 上面实例代码运行结果
![](https://img.kancloud.cn/8f/ed/8fed21f78a05eafd6c7ccc22ca50672a_592x129.png)
*****
* **接口**
用来建立某种代码约定,使得其他开发者在调用某一个方法或者创建新的类时必须遵守接口所定义的代码约定
接口声明属性
~~~
interface Iphone {
size: string;
colour: string;
}
class X {
constructor(public config: Iphone) {
}
}
var phone = new X(
{
size: 'X',
colour: 'golden'
}
);
~~~
接口声明属性和方法 使用implements 基础接口类
~~~
interface Ip {
size: string;
site(): void;
}
class XX implements Ip{
size: string;
constructor(param: string){
this.size = param;
}
site(){
console.log('over');
}
}
~~~