什么是面向对象
- 把客观对象抽象成属性数据和对数据的相关操作,把内部细节和不相关的信息隐藏起来
- 把同意类型的客观对象的属性和操作绑定在一起,封装成类
- 面向对象分析 OOA
- 面向对象设计 OOD
- 面向对象编程 OOP
概念
- 类,对象(实例)
这里需要提示一下下,类,本来是没有的概念,就像本来石头也不叫石头的,我们为了方便记忆和分类,就给他起了一个名字,这就是定义类
- 父类是公共的
问题又来了,随着时代的发展和进步,我们发现石头原来有各种各样的,如玉,岩石,鹅卵石,不管怎么样,都是石头,这个时候石头就是他们的父类,他们都具备石头的有点
- 定义类
class Animal{ constructor (name) { this.name = name } say () { console.log(`my name is ${this.name}`) } } let dog = new Animal('littel dog') dog.say()
- 继承类
- 子类继承父类
- 继承可以把公共方法抽离出来,提高复用,减少冗余
嗯换一个列子说说:有一个人张三,他生了儿子,管他叫做张大宝,那么张大宝就继承了张三的姓,或者说部分基因,要不然也不能说长的像他爸爸
后来张大宝长大了,要工作,然后他父亲就问他以后想做什么,大宝说,我想着xxx, 这个时候如警察,医生,码农每个职业都有自己特有的技能,需要单独去学习,然后成为警察,或者医生,或者码农,这就是抽离
class Animal{
constructor (name) {
this.name = name
}
say () {
console.log(`my name is ${this.name}`)
}
}
class Dog extends Animal{
constructor() {
super('狗')
}
speak () {
console.log('汪汪汪')
}
}
let dog = new Dog('littel dog')
dog.say()
dog.speak()
- 封装
- 把数据封装起来
- 减少耦合,不该访问的不让外部访问
- 利于数据的接口权限管理
- ES6 不支持私有属性,一般_ 开头的都会私有的,不要使用
- 实现
- public: 共有修饰符,默认修饰符
- protected:受保护的修饰符,可以被类和子类使用protect修饰的属性和行为
- private:私有修饰符,只可以在类内部使用
到了后来张大宝长大了,已经做了一名码农,自己潜心学习nodejs,工作岗位是前端切图仔,这个时候他就和大多数切图在一样,会基本的切图计能(public)
但是他喜欢把自己学到的只是出去,写博客什么的,分享供他人学习和借鉴(protect)
大宝毕竟是大宝,他还利用闲暇时间研究了很多心法,内功深厚,各种工作中的疑难杂症上手分分钟解决(private)
// 创建父类
class Animal{
public name;
protected age;
private weight;
constructor (name, age, weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
}
// 继承父类
class Person extends Animal {
private money;
constructor (name, age, weight, money) {
super(name, age, weight);
this.money = money;
}
getName(){
console.log(this.name)
}
getAge(){
console.log(this.age)
}
}
// 创建实例
let p = new Person('leo', 18, 190, 100)
-
多态
- 同一个接口可以不同实现
- 保持子类开放性和灵活性
- 面向接口编程
时代是多变的,随着几年的发展,大宝发现切图仔越南越难做了,后来他在工作中学会了各种编码技能,然后当别的切图仔都要失业了,但是大宝会养猪,他养猪去了,大宝还是大宝,但已经不是那个切图仔了…
/**
* @desc 多态
*/
class Animal{
name: string;
constructor (name) {
this.name = name;
}
// 把eat当成一个接口,让子类继承,实现不同的功能,就是多态
eat(food) {
}
}
class Dog extends Animal{
eat (food) {
console.log(`${this.name}吃${food}`)
}
}
class Person extends Animal{
eat (food) {
console.log(`${this.name}吃${food}`)
}
}
let dog = new Dog('狗')
dog.eat('包子')
let p = new Person('ren')
p.eat('亏')
结束语
忘记了什么后学的设计模式,知道某一天面试,某官问道,发现自己基本上已经忘,近期抽时间学习一下,温故而知新啊啊啊啊。。。。