1、封装
低耦合 高内聚
保护变量安全性
弱化了代码执行的 逻辑,只要告诉用户如何调用,能实现什么样的效果
2、继承
一些子类,能够获取到父类的一些属性和方法,主要的原因还是为了降低内存的占用,和减少代码的重复性
提高代码的复用性和可拓展性
①原型继承:原型继承,就是在本身的原型链上加一层结构
function Student() {}
Student.prototype = new Person()
注:把函数的原型对象指向想要继承的父类
②借用构造函数继承 :把父类构造函数体借用过来使用一下
function Student() {
Person.call(this)
}
③组合继承:就是把 原型继承 和 借用构造函数继承 两个方式组合在一起
function Student() {
Person.call(this)
}
Student.prototype = new Person
Student.prototype.constructor = Student
④ES6继承(类继承expends super())
3、多态
JS里面是没有多态的给概念的,
原Java中的多态概念:如函数中有两个参数,则做加法预算,如果有三个参数,则进行乘法运算
面对对象的多态建立在继承和封装的基础之上,可以改写方法或者改写方法上的参数
①重载:不改变函数的参数和不改变函数返回值的情况下,修改了函数
案例一:
Object.prototype.toString.call(null)
//null本身没有toString方法
//借用了Object原型上的toString方法,这个方法本来应该属于Object 但是却被null调用了
案例二:
let obj = {
add(a, b) {
return a + b
}
}
obj.add = function(a, b) {
console.log('重写了')
return a + b
}
②重写:多次声明同名的函数,在参数不一样的时候,获得不一样的处理结果
js本身是不能声明多个函数名相同的函数的,因为相同的函数名的函数会把之前的函数覆盖
我们通过可以 通过判断参数的长度的方式来实现重载
// 实现重载
function fn12() {
//通过arguments长度 判断长度不同 实现不同的逻辑
let arg = arguments;
switch (arg.length) {
case 1:
console.log(arg[0]);
break;
case 2:
return arg[0] + arg[1];
case 3:
return arg[0] * arg[1] * arg[2]
}
}
fn12(99)
console.log(fn12(3, 2));
console.log(fn12(1, 2, 3));