我们研究类,就是研究类的继承、封装与多态 多态包括重载与重写
重载 :
后端语言是指函数名相同,参数类型与个数不同,根据不同参数列表调用不同函数。
前端JS没有真正意义上的重载。前端的重载是指同一个函数,根据传参不同实现不同效果。
继承
原型继承
其他语言的继承一般是拷贝继承,会把父类的属性和方法拷贝一份到子类,供子类的调取和使用。
JS中的继承是把父类的原型放到子类实例的原型链上,子类调取这些方法是通过
__proto__
原型链查找机制完成的。
<script>
function A (x){
this.x=x;
}
A.prototype.getX = function (){
console.log(this.x);
}
function B (y){
this.y=y;
}
B.prototype = new A (100); //使B的原型指向A的实例对象
B.prototype.constructor = B; //最好加上这句话确保原型链完整
B.prototype.getY = function (){
console.log(this.y);
}
</script>
特别提醒
1.其中一个子类对父类方法的修改也会影响其他子类
2.原型链上的私有属性将变为共有属性
Call继承
function A (x){
this.x=x;
}
A.prototype.getX = function (){
console.log(this.s);
}
function B (y){
//A() -->将A当作普通函数进行调用,this指向windows
A.call(this,200);//通过call函数将A中的this指向B的实例对象b1 this.x=x-->b1.x=x
this.y=y;
}
child把parent当作普通函数执行,让parent中this指向child,相当于给child设置了私有属性和方法,这样只能继承父类的私有属性和方法,并不能继承原型链上的
寄生组合原型继承
Call继承+类似原型继承 父类公有和私有属性方法分别是子类实例的公有和私有属性方法
<script>
function B (y){
A.call(this,200);
this.y=y;
}
B.prototype = Object.create(A.prototype);// Object.create()的代码如下
B.prototype.constructer = B;
B.prototype.getY = function (){
console.log(Y);
}
Object.create = function (obj){
let Fn = funciton (){};
Fn.prototype = obj;
return new Fn();
}
</script>
ES6中的继承
<script>
class A {
constructor (x){
this.x=x;
}
getX (x) {
console.log(x)
}
}
class B extends A{ //使B继承A
constructor (y){ //子类继承父类可以不写construcor,一旦写了第一句写super()
super(200); //相当于call(this,200) 把A当作普通函数调用,并修改this指向
this.y=y;
}
getY (y){
console.log(y);
}
}
</script>