1.类式继承:
//声明父类
function SuperClass(){
this.superValue = true;
}
//为父类添加共有方法
SuperClass.prototype.getSuperValue = function(){
return this.superValue;
}
//声明子类
function SubClass(){
this.subValue = false;
}
//继承父类
SubClass.prototype = new SuperClass();
//为子类添加共有方法
SubClass.prototype.getSubValue = function(){
return this.subValue;
}
优点:所有子类实例可共用父类的属性与方法
缺点:子类实例容易误修改公用属性(从父类继承),且子类实现继承靠其原型prototype对父类进行实例化,故无法向父类传递参数,也无法在父类实例化时,对父类内部属性进行初始化
应用场景:父类无属性,或者父类属性是用于存储结果的(对象,数组等)
2.构造函数继承
//声明父类
function SuperClass(id) {
this.common = {aa:"aa"};
this.id = id;
}
//为父类添加共有方法
SuperClass.prototype.getSuperValue = function () {
console.log(this.common);
}
//声明子类
function SubClass(id) {
/**
* 这里写子类特有属性(多个子类)
*/
// 继承父类
SuperClass.call(this,id);
}
优点:子类实例化父类中的属性
缺点:没有公用属性和公用方法
应用场景:父类只是提供给子类进行初始化子类共有的属性,其属性值可以由子类传递也可以由父类定义;
3.组合继承
//声明父类
function SuperClass(id) {
this.common = {aa:"aa"};
this.id = id;
}
//为父类添加共有方法
SuperClass.prototype.getSuperValue = function () {
console.log(this.common);
}
//声明子类
function SubClass(id) {
/**
* 这里写子类特有属性(多个子类)
*/
// 继承父类
SuperClass.call(this,id);
}
// 类式继承 子类原型继承父类
SubClass.prototype = new SuperClass();
// 子类原型方法
SubClass.prototype.getId = function(){
console.log(this.id);
}
优点:既有类式继承的优点,也有构造函数继承的优点
缺点:与类似继承一样(比如函数覆盖,无法恢复),造成资源浪费(构造函数执行了两次)
应用场景:不建议使用;
4.原型式继承
function inheritObject(o){
// 声明一个过度函数对象
function F(){};
//过度对象的原型继承父对象
F.prototype = o;
//返回过度对象的一个实例
return new F();
}
优点:给多个子类继承时,不必每次实例化父类,通过过度实例继承,也不会意外改变继承来的父类属性,减少开销(目前衍生objcet.create方法)
5.寄生式继承
//声明基对象
var book = {
name: "js",
}
function createBook(obj) {
// 通过运行继承方式创建对象
var o = inheritObject(obj);
// 拓展新对象
o.getName = function () {
console.log(this.name)
}
//返回拓展后的新对象
return o;
}
优点:对原型对象进行拓展,但不更改继承的父类
应用场景:无
6.寄生组合式继承
/**
* 寄生式继承 继承原型
* 传递参数 subClass 子类
* 传递参数 superClass 父类
*/
function inheritPrototype(subClass,superClass){
// 复制一份父类的原型副本保存在变量中
var p = inheritObject(superClass.prototype);
// 修正因为重写子类原型导致子类的constructor属性被修改
p.constructor = subClass;
// 设置子类原型
subClass.prototype = p;
}
优点:集合构造函数继承和寄生式继承的优点,且修复了子类原型的constructor的指向
缺点:给子类原型添加方法必须通过点语法一一添加
应用场景:父类既有子类需要初始化的属性,又有子类需要公用的属性
7.多继承
使用Object.assign()方法对继承的对象进行拓展(SE6),也可写函数实现同样效果
8.多态
通过检测传入参数类型或长度等,进行不同方法的调用