JS中的多种继承方式(包含ES6)
程序员文章站
2022-06-19 17:07:42
为了让有JAVA基础的小伙伴更直观的看到区别简单描述一下JS中的继承、方法重载跟JAVA中的继承、方法重载区别**JS继承:**js中的继承有多种方式,大体上就是两种,一种是基于原型链覆盖的形式、一种是对象冒充也就是通过改变this指向。支持多继承,通过原型链可以一直往上找。**JAVA继承:**java中的继承是一个类继承了父类以后,它就不能再继承别的类,只支持单继承。但是java中存在接口,接口从本质上来说可以更好的代替继承,可以把需要的方法定义在接口中,让具体的类实现接口中的功能。**JS....
- 为了让有JAVA基础的小伙伴更直观的看到区别简单描述一下JS中的继承、方法重载跟JAVA中的继承、方法重载区别
- JS继承:
js中的继承有多种方式,大体上就是两种,一种是基于原型链覆盖的形式、一种是对象冒充也就是通过改变this指向。支持多继承,通过原型链可以一直往上找。
- JAVA继承:
java中的继承是一个类继承了父类以后,它就不能再继承别的类,只支持单继承。但是java中存在接口,接口从本质上来说可以更好的代替继承,可以把需要的方法定义在接口中,让具体的类实现接口中的功能。
- JS重载:
js中不存在重载,相同名字的函数由于js底层原理(变量提升)会导致相同名字的函数覆盖。
- JAVA重载:
java中重载是可以定义相同名字的接口(方法)参数不同、参数个数不同、返回值不同实现不同的功能。
- JS第一种继承方案:原型继承(子类原型=父类的实例)
function Parent(){
this.x = 100;
}
Parent.prototype.getX = function getX(){
return this.x;
}
function Child(){
this.y = 200;
}
//原型继承 Child通过原型链可以找到Parent中的私有属性和Parent.prototype中的公有属性
Child.prototype = new Parent;
Child.prototype.getY = function getY(){
return this.y;
}
var child1 = new Child;
原型继承特点:
1.父类中私有和公有的属性方法,最后都变为子类实例公有的;
2.和其它语言不同的是,原型继承并不会把父类的属性方法 copy给子类,而是让子类实例基于__proto__原型链上找到自己定义的属性和方法“指向/查找”方式的;
3.修改子类原型中的内容,内容修改后,对子类的其他实例有影响,但是对父类的实例不会有影响。直接修改父类的原型,不仅影响父类的实例,也会影响子类的实例。
- JS第二种继承方案,call继承:
function Parent(){
this.x = 100;
}
Parent.prototype.getX = function getX(){
return this.x;
}
function Child(){
//在子类构造函数中,把父类当做普通方法执行(没有父类实例,父类原型上的公共属性方法就和它没关系了)"拷贝式"
Parent.call(this);
this.y = 200;
}
Child.prototype.getY = function getY(){
return this.y;
}
var child1 = new Child;
特点:
call继承,只能继承父类中私有的,不能继承父类*有的
- JS第三种继承方案,寄生组合式继承(call继承 + 另类原型继承):
function Parent(){
this.x = 100;
}
Parent.prototype.getX = function getX(){
return this.x;
}
function Child(){
Parent.call(this);
this.y = 200;
}
//IE浏览器下不支持操作__proto__
//Child.prototype.__proto__=Parent.prototype;
//兼容性写法 Child原型指向一个空对象,空对象的原型指向的Parent的原型
Child.prototype = Object.create(Parent.prototype);
Child.prototype.contructor=Child;
Child.prototype.getY = function getY(){
return this.y;
}
var child1 = new Child;
- ES6中的类和继承,extends Parent:
ES6中创建的就是类,不能当做普通函数执行,只能new执行。继承后一定要在constructor第一行加上super();
class Parent{
constructor(){
this.x=100;
}
getX(){
retrun this.x;
}
}
class Child extends Parent{
constructor(){
super();//类似于call继承super(100,200) 相当于把Parent中的constructor执行,传递了100和200
this.y=200;
}
getY(){
retrun this.y;
}
}
本文地址:https://blog.csdn.net/Lele___/article/details/111596566