有如下父类
functionPeople(name,age){this.name= namethis.age= agethis.seelp=function(){
console.log('i am seelp')}}
People.prototype.eat=function(){
console.log('i can eat')}
原型链继承
原理:
子类 的 prototype = 父类 的 实例
优点:
简单
不占用多余内存 父类实例化一次
原型属性继承
缺点:
无法对父类传递参数
在原型链上增加方法或者属性只能在实例化父类之后
无法实现多继承
非原型属性继承后无意义(undefined)
实现:
functionWoman(name,age){this.sex='女';}
Woman.prototype=newPeople()
Woman.prototype.constructor= Woman
Woman.prototype.a='aaaa'var personal=newWoman('小丽','28')
personal={
sex:"女",
__proto__:{
a:"aaaa",
age: undefined,
name: undefined,
seelp:ƒ(),
__proto__: Object}}
使用构造函数
原理:
在子类构造函数中,使用call修改父类的this指向
优点:
可像父类传递参数
可实现多继承
非原型属性继承
实现简单
方便新增属性
缺点:
原型属性无法继承
多占用内存(每个子类的实例,都调用了父类的实例)
functionWoman(name,age){
People.call(this,name,age)
Base.call(this,name,age)}var personal=newWoman('小丽','28')
personal={
age:"28",
jump:true,
name:"小丽",
seelp:ƒ(),
__proto__:{
constructor: ƒWoman(name,age)
__proto__: Object}}
组合式继承
原理:
调用父类构造函数,继承父类的属性,通过将父类实例作为子类原型,实现函数复用
优点:
可像父类传递参数
可实现多继承
非原型属性继承
原型属性继承
缺点:
多占用内存(每个子类的实例,都调用了父类的实例)
functionWoman(name,age){
People.call(this,name,age)}
Woman.prototype=newPeople();
Woman.prototype.constructor= Woman;var personal=newWoman('小刘鸭','27')
personal={
age:27,
name:"小刘鸭",
seelp:ƒ(),
__proto__:{
age: undefined,
constructor: Woman,
name: undefined,
seelp:ƒ(),
__proto__: Object}}
寄生组合继承
原理:
子类的原型不再是父类的实例,而是空类,空类的原型指向父类的原型,
优点:
可像父类传递参数
可实现多继承
非原型属性继承
原型属性继承
functionWoman(name,age){//继承父类属性
People.call(this,name,age)}//继承父类方法(function(){// 创建空类letSuper=function(){};
Super.prototype= People.prototype;//父类的实例作为子类的原型
Woman.prototype=newSuper();})();//修复构造函数指向问题
Woman.prototype.constructor= Woman;var personal=newWoman('小刘鸭',27)
personal={
age:27,
name:"小刘鸭",
seelp:ƒ(),
__proto__:{
constructor:Woman(name, age),
__proto__:{
eat:ƒ(),
constructor:People(name, age),
__proto__: Object}}}