面向对象:是一种编程思想,JS本身就是基于面向对象构建出来的,JS中类和实例是基于原型和原型链机制来处理的。Java中面向对象有封装继承与多态这三个特点,js也一样。
封装:低耦合,高内聚
多态:多态又分为重写和重载,重写是指在类的继承中,子类重写父类的方法。重载则是指方法名相同,形式参数个数或者类型不一直[JS不存在真正意义上的重载,JS重载指的是同一个方法,根据传参不同来实现不同的效果]
继承:子类继承父类的属性和方法
关于js的继承,只要想记录以下几点
原型继承。让父类中的属性和方法在子类实例的原型链上,子类的原型指向父类的实例。
child.prototype = new parent();
child.prototype.constructor = child
//prototype=>公有相关
//constructor=>重定向
特点:
- 不像其他语言的继承一样(其他语言的继承一般为拷贝继承),JS是把父类的原型放到子类实例的原型链上,实例想要调取这些方法, 是基于_proto_原型链查找几只完成的。
- 子类可以重写父类上的方法(但也会导致父类其他实例变更)
- 父类中私有或公有的属性和方法,最后都会变成子类中公有属性和方法
call继承。子类方法中吧父类当做普通函数执行,让父类的this指向子类的实例,相当于给子类的实例设置了很多的私有属性和方法。
特点:
- 只能继承父类私有的属性或方法(因为是把父类当做普通函数执行,与其原型上的属性和方法无关)
- 父类私有的属性或方法会变成子类私有的属性或方法
寄生组合继承。call继承+类似原生继承
特点:
- 父类私有和共有的分别是子类实例的私有和共有属性方法
ES6中的继承(属于寄生组合),与前几个继承不同的是ES6的继承是由固定语法的。类似Java继承包含关键字extends
class child extends parent
{
constructor(y){
super();
this.y=y;
}
getY(){
console.log(this.y)
}
}
//es6这类写法 类似于b.prototype._proto_= a.prototype
//constructor与super()必须同时存在,在继承中可以不写constructor,一旦写了第一句必须是super.
//若不写,则浏览器会默认创建constructor(...args){ super(...args)}