面向对象基本特征
封装
-
对象就是一个用来存储不同属性的容器
-
对象不仅负责属性,还要负责数据的安全
-
直接添加到对象的属性,并不安全,因为它们可以被任意的修改
-
如何确保数据的安全:
-
私有化数据
- 将需要保护的数据设置为私有,只能在类内部使用
-
提供setter和getter方法来开放对数据的操作
- 属性设置私有,通过getter setter方法操作带来的好处
- 可以控制属性的读写权限
- 可以在方法中对属性的值进行验证
- 属性设置私有,通过getter setter方法操作带来的好处
-
封装主要用来保证数据的安全
-
实现封装的方式:
-
属性私有化 加#
-
通过getter和setter方法来操作属性
get 属性名(){
return this.#属性
}
set 属性名(参数){
this.#属性 = 参数
}
-
-
class Person {
/*
实例化使用#开头就变成了私有属性,私有属性只能在类内部访问
*/
#name;
#age;
#gender;
constructor(name, age, gender) {
this.#name = name;
this.#age = age;
this.#gender = gender;
}
sayHello() {
console.log(this.#name);
}
// getter方法,用来读取属性
getName() {
return this.#name;
}
// setter方法,用来设置属性
setName(name) {
// 可以写逻辑
this.#name = name;
}
// 新写法
get age() {
return this.#age;
}
set age(age) {
this.#age = age;
}
}
const p1 = new Person("孙悟空", 18, "男");
p1.setName("猪八戒");
p1.age = 28;
console.log(p1.age); // 28
继承
- 可以通过extends关键字来完成继承
- 当一个类继承另一个类时,就相当于将另一个类中的代码复制到当前类中
- 继承发生时,被继承的类称为 父类(超类),继承的类称为 子类
- 通过继承可以减少重复的代码,并且可以在不修改一个类的前提对其进行扩展
- 封装 --- 安全性,继承 --- 扩展性,多态 --- 灵活性
- 通过 继承可以在不修改一个类的情况下对其进行扩展
- OCP 开闭原则
- 程序应该对修改关闭,对扩展开放
class Animal {
constructor(name) {
this.name = name;
}
sayHello() {
console.log("动物在叫");
}
}
class Dog extends Animal {
/*
在子类中,可以通过创建同名方法来重写父类的方法
*/
sayHello() {
console.log("汪汪汪");
}
}
class Cat extends Animal {
/*
重写构造函数
重写构造函数时,构造函数的第一行代码必须为super()
*/
constructor(name, age) {
super(name); // 调用父类的构造函数
this.age = age;
}
sayHello() {
// 在方法中可以使用super来引用父类的方法
super.sayHello();
console.log("喵喵喵");
}
}
const dog = new Dog("旺财");
const cat = new Cat("汤姆", 3);
dog.sayHello(); // 汪汪汪
cat.sayHello(); // 动物在叫 喵喵喵
console.log(dog.name); // 旺财
console.log(cat.name, cat.age); // 汤姆 3
多态
- 在JS中不会检查参数的类型,所以这就意味着任何数据都可以作为参数传递
- 要调用某个函数,无需指定类型,只要对象满足某些条件即可