封装:
- 将可复用的代码用一个结构包装起来, 后面可以反复使用
- js的哪些语法体现了封装性: 函数 ==> 对象 ==> 模块 ==> 组件 ==> 库
- 封装都要有个特点: 不需要外部看到的必须隐藏起来, 只向外部暴露想让外部使用的功能或数据
继承:
为什么要有继承?
复用代码, 从而减少编码
js中的继承都是基于原型的继承: ES6的类本质也是 编码实现: 原型链+借用构造函数的组合 / ES6的类继承
通俗来说:继承是子类自动共享父类数据和方法的机制。子类可以继承父类的属性和行为,并可以增加新的属性或重写父类的方法。通过继承,可以构建一个类层次结构,其中子类继承父类的特征,并可以在此基础上进行扩展和定制。继承增强了代码的复用性,减少了冗余,并在一定程度上支持“is-a”类型的关系
多态: 多种形态
理解
- 声明时指定一个类型对象, 并调用其方法,
- 实际使用时可以指定任意子类型对象, 运行的方法就是当前子类型对象的方法
JS中有多态:
由于JS是弱类型语言, 在声明时都不用指定类型
在使用时可以指定任意类型的数据 ==> 这已经就是多态的体现了
它们共同支持复杂系统的设计和开发,提高软件的组织性、可读性和可维护性。
以下是 JavaScript 中面向对象的三大特征的示例:
1.封装
class Animal {
constructor(name) {
// 封装属性
this._name = name; // 使用下划线表示私有属性
}
// 提供 getter 和 setter 方法来操作私有属性
get name() {
return this._name;
}
set name(newName) {
this._name = newName;
}
// 其他方法...
}
1.继承
class Dog extends Animal {
constructor(name, breed) {
super(name); // 调用父类构造函数
this.breed = breed;
}
bark() {
console.log(`${this.name} says Woof!`);
}
// 可以重写父类方法,实现多态
speak() {
console.log("I'm a dog and I can bark.");
super.speak(); // 调用父类的 speak 方法
}
}
// 父类 Animal 的 speak 方法
Animal.prototype.speak = function () {
console.log("I am an animal.");
};
3.多态:
let myDog = new Dog('Rex', 'Labrador');
myDog.name = 'Buddy'; // 使用 setter 修改封装的属性
console.log(myDog.name); // 使用 getter 获取封装的属性
myDog.bark(); // Dog 类独有的方法
myDog.speak(); // 显示多态,虽然都是 speak 方法,但是 Dog 类有自己的实现
let myCat = new Animal('Kitty');
myCat.speak(); // Animal 类的 speak 方法
// 上述代码中,speak 方法的调用展示了基于对象类型的多态性