1、什么是继承?
继承是面向对象软件技术中的一个概念。
2、js中有哪儿些继承?
js中的继承有ES6的类class的继承、原型链继承、构造函数继承、组合继承、寄生组合继承。
2.1 ES6中类的继承
class Parent {
constructor() {
this.age = 18;
}
}
class Child extends Parent {
constructor() {
super();
this.name = "张三"
}
}
let o1 = new Child();
console.log(o1,'o1');
优先使用ES6的class继承方式。
2.2 原型链继承
function Person(name) {
this.name = "lx"
}
function Student(age) {
this.age = 22;
}
Student.prototype = new Person();
let stu = new Student();
console.log(stu,'stu');
缺点:如果父类的原型对象上有一个属性 是引用类型的值,那么所有的实例都会共享这个引用类型,如果一个实例改变了该属性,其他实例的该属性都会被改变。
2.3 构造函数继承
function Person(name) {
this.name = "lx"
}
function Student(age) {
Person.call(this);
this.age = 22;
}
let stu = new Student();
console.log(stu,'stu');
优点:原型属性不会被共享
缺点:不能继承父类prototype上的属性
2.4 组合继承(原型链继承+构造函数继承)
function Person(name) {
this.name = "lx"
}
function Student(age) {
Person.call(this);
this.age = 22;
}
Student.prototype = new Person();
let stu = new Student();
console.log(stu,'stu');
优点:1. 原型属性不会被共享 2.可以继承父类的prototype的属性和方法
缺点:1. 它调用了2次Parent() 2. 它在Child的prototype上添加了父类的属性和方法。
2.5 寄生组合继承(原型链继承+构造函数继承+组合继承)
function Person(name) {
this.name = "lx"
}
function Student(age) {
Person.call(this);
this.age = 22;
}
Student.prototype = Object.create(Person.prototype);
let stu = new Student();
console.log(stu,'stu');
优点:1. 原型属性不会被共享 2. 可以继承父类的prototype的属性和方法 3. 调用1次Parent(),它不会再Child的prototype上添加父类的属性和方法。
缺点:Child的prototype上的原始属性和方法会丢失。