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上的原始屬性和方法會丟失。