面向对象的特征:
- 封装性---(安全性)
- 继承性---(扩展性)
- 多态性---(灵活性)
面向对象的编程指,程序中的所有操作都是通过对象来完成
做任何事情之前都需要先找到它的对象,然后通过对象来完成各种操作
1.封装
- 对象就是一个用来
存储不同属性的容器
- 对象不仅存储属性,还要负责
数据的安全
- 直接添加到对象中的属性,并不安全,因为它们可以被任意的修改
如何确保数据的安全:
- 1.私有化数据
将需要保护的数据设置为私有,只能在类内部使用
- 2.提供setter和getter方法来开放对数据的操作
属性设置私有,通过getter setter方法操作属性带来的好处
(1) 可以控制属性的读写权限 ( 比如:我可以只给获取权限,不给修改权限)
(2) 可以在方法中对属性的值进行验证
get和set的格式是:
get 属性名(){
return this.#属性
}
set 属性名(参数){
this.#属性 = 参数
}
封装主要用来保证数据的安全
- 实现封装的方式:
// 1.属性私有化 加 #
class Person {
#name = "孙悟空"
constructor(name,age) {
this.#name = name
// 如果想给私有属性赋值,必须得先声明,才能访问
this.age = age
}
}
// 通过getter和setter方法来操作属性
class Person2 {
#name = "孙悟空"
get gender() {
return this.#name
}
set gender(name) {
this.#name = name
}
}
const p2 = new Person2( )
p2.gender // 通过p2.gender获取属性
p2.gender = "猪八戒" // 通过set修改
console.log(p2.gender);
当然上面是使用get和set的格式,我们也有简单直接的写法,如下:
class Person3 {
#age = 18
getAge() {
return this.#age // 直接定义一个函数
}
setAge(age) {
this.#age = age
}
}
const p3 = new Person3()
console.log(p3.getAge());
p3.setAge(20)
console.log(p3.getAge());
2.多态
- 在JS中不会检查参数的类型,所以这就意味着任何数据都可以作为参数传递
- 要调用某个函数,
无需指定的类型,只要对象满足某些条件即可 - 如果一个东西走路像鸭子,叫起来像鸭子,那么它就是鸭子
多态为我们提供了灵活性
定义一个函数,这个函数将接收一个对象作为参数,他可以输出hello并打印对象的name属性
class Person {
constructor(name) {
this.name = name
}
}
const dog = new Person("旺财")
const person = new Person("孙悟空")
function sayHello(obj) {
console.log("Hello"+ obj.name);
}
sayHello(dog) // 不管我调用时传入的是dog还是persn
sayHello(person) // 它都会能打印出hello+旺财或者+孙悟空
// 它是不受限制的
3.继承
继承的意思是减少代码的重复性,并且可以在不修改一个类的前提对其进行扩展
当一个类继承另一个类时,就相当于将另一个类中的代码复制到了当前类中(简单理解)
通过 extends关键字来进行继承
被继承的类是父类(超类),继承的类是子类
class Person {
constructor(name){
this.name = name
}
sayHello() {
console.log("动物们在叫");
}
}
const p1 = new Person("孙悟空")
// 比如我想把Person类里面的东西继承给别的类
class Dog extends Person {
}
const dog = new Person("狗") // dog里就有name和sayhello方法了
// 但是为什么要这样干呢?
因为假如我要写多个类,而他们里面都有name和sayhello方法,那我就可以用继承,这样节约了代码的重复性
继承的扩展
通过继承可以在不修改一个类的情况下对其进行扩展
一般在开发中,别人写的类,可能需要很多人用,你不能直接修改,所以通过继承,这样避免修改源代码
class Person {
constructor(name) {
this.name = name
}
sayHello() {
console.log("动物们在叫");
}
}
class Dog extends Person {
sayHello() {
console.log("汪汪汪");
super.sayHello() // 调用父类的sayhello
}
// 重写构造函数
constructor(name) {// 重写构造函数第一行代码必须是super()
super(name) // 调用父类的super
this.age = 1 // 也可以在重写的构造函数里加新的属性
}
}
const dog = new Dog("狗")
dog.sayHello()
console.log(dog);