面向对象得特点
封装 继承 多态
(一)封装
- 对象就是一个用来存储不同属性的容器
- 对象不仅负责存储属性,还要负责数据的安全
- 直接添加到对象中的属性,并不安全,因为它们可以被任意的修改
- 如何确保数据的安全:
1.私有属性化
- 实例使用#就变成私有属性,私有属性只能在类内部访问
- 私有属性要先声明
2.提供setter和getter方法 进行访问和修改私有属性
- 属性设置私有的好处,可以控制属性的读写权限
- 可以在方法中,对属性的值进行验证
3.封装主要用来保证数据的安全
4.封装实现的方式
1.属性私有化 加#
2.通过getter和setter方法操作属性
5.代码演示
class Person{
#name
#age
constructor(name,age){
this.#name = name
this.#age = age
}
getName(){
return this.#name
}
setName(name){
this.#name = name
}
// 第二种方式
get Age(){
return this.#age
}
set Age(age){
this.#age = age
}
}
const p1 = new Person('xmm',12)
console.log(p1.getName())
console.log(p1.Age)
p1.setName('hxxx')
p1.Age = 18
console.log(p1.getName())
console.log(p1.Age)
打印之后
二 多态
- 在js中不会检查参数的类型,所以这就意味着任何数据都可以作为参数传递
- 要调用某个函数,无需指定的类型,只要对象满足某些条件即可
- 多态让代码更灵活
三 继承
- 可以通过extends关键来完成继承
- 当一个类继承另一个类的时候,就相当于另一个类中的代码复制到了当前类中
- 继承发生时,被继承的类成为父类(超类),继承的类称为子类
- 通过继承可以在不修改一个类的前提对其进行扩展
- 通过继承可以在不修改一个类的情况下对其进行扩展
代码实现
class Animal{
constructor(name){
this.name = name
}
sayhello(){
console.log(this.name+'在叫')
}
}
class Dog extends Animal{
// 重写构造函数
constructor(name,age){
// 重写构造函数时,构造函数的第一行代码必须为super()
super(name)
this.age = age
}
// 在子类中可以通过创建同名方法来重新父类的方法
sayhello(){
super.sayhello // 在方法中可以使用super来引用父类的方法
console.log(this.name+'在汪汪')
}
}
class Cat extends Animal{
sayhello(){
console.log(this.name+'喵喵喵')
}
}
const dog = new Dog('四毛')
const cat = new Cat('木木')
dog.sayhello()
cat.sayhello()