-
- 1.原型链实现继承:
-
- 核心: 将父类的实例作为子类的原型;
-
特点:
- 非常纯粹的继承关系,实例是子类的实例,也是父类的实例
- 父类新增原型方法/原型属性,子类都能访问到
- 简单,易于实现
-
缺点:
- 要想为子类新增属性和方法,必须要在
new Animal()
这样的语句之后执行,不能放到构造器中 - 无法实现多继承
- 来自原型对象的引用属性是所有实例共享的(详细请看附录代码: 示例1)
- 创建子类实例时,无法向父类构造函数传参
- 要想为子类新增属性和方法,必须要在
-
- 2.混入继承(拷贝继承)
-
-
特点:
- 支持多继承
-
缺点:
- 效率较低,内存占用高(因为要拷贝父类的属性)
- 无法获取父类不可枚举的方法(不可枚举方法,不能使用for in 访问到)
-
-
- 3.原型式继承(经典继承)
-
-
-
-
-
-
- 总结:创建一个新的对象,让新的对象可以继承自指定的对象,从而这个新的对象及可以访问到自己的属性,也可以访问到指定的对象属性;
- 现代浏览器中:Object.create()实现了原型式继承
- ES5(js语言规范的第五个版本)--Object.create()--->9以下不支持
-
-
-
-
- 4.借用构造函数实现继承
-
-
-
- 核心:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型);
-
特点:
- 解决了1中,子类实例共享父类引用属性的问题
- 创建子类实例时,可以向父类传递参数
- 可以实现多继承(call多个父类对象)
-
缺点:
- 实例并不是父类的实例,只是子类的实例
- 只能继承父类的实例属性和方法,不能继承原型属性/方法
- 无法实现函数复用,每个子类都有父类实例函数的副本,影响性能
-
- 5.组合继承
- 核心:通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用
-
特点:
- 既是子类的实例,也是父类的实例
- 不存在引用属性共享问题
- 可传参
- 函数可复用
-
缺点:
- 调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了)
-
推荐指数:★★★★(仅仅多消耗了一点内存)
-
-
-
-
- 1.原型链实现继承: