javascript继承、js继承实现方式、js继承优缺点

有如下父类

function People(name,age){
    this.name = name
    this.age = age
    this.seelp = function(){
        console.log('i am seelp')
    }
}
People.prototype.eat = function(){
    console.log('i can eat')
}

原型链继承

原理:
子类 的 prototype = 父类 的 实例
优点:

简单
不占用多余内存 父类实例化一次
原型属性继承

缺点:

无法对父类传递参数
在原型链上增加方法或者属性只能在实例化父类之后
无法实现多继承
非原型属性继承后无意义(undefined)

实现:

function Woman (name,age){
    this.sex = '女';
}
Woman.prototype = new People()
Woman.prototype.constructor = Woman
Woman.prototype.a = 'aaaa'
var personal = new Woman('小丽','28')
personal = {
    sex: "女",
    __proto__: {
        a: "aaaa",
        age: undefined,
        name: undefined,
        seelp: ƒ (),
        __proto__: Object
    }
}

使用构造函数

原理:
在子类构造函数中,使用call修改父类的this指向
优点:

可像父类传递参数
可实现多继承
非原型属性继承
实现简单
方便新增属性

缺点:

原型属性无法继承
多占用内存(每个子类的实例,都调用了父类的实例)

function Woman(name,age){
    People.call(this,name,age)
    Base.call(this,name,age)
}
var personal = new Woman('小丽','28')
personal = {
    age: "28",
    jump: true,
    name: "小丽",
    seelp: ƒ (),
    __proto__:{
        constructor: ƒ Woman(name,age)
        __proto__: Object
    }
}

组合式继承

原理:
调用父类构造函数,继承父类的属性,通过将父类实例作为子类原型,实现函数复用
优点:

可像父类传递参数
可实现多继承
非原型属性继承
原型属性继承

缺点:

多占用内存(每个子类的实例,都调用了父类的实例)

function Woman(name,age){
  People.call(this,name,age)
}
Woman.prototype = new People();
Woman.prototype.constructor = Woman;
var personal = new Woman('小刘鸭','27')
personal = {
    age: 27,
    name: "小刘鸭",
    seelp: ƒ(),
    __proto__: {
	      age: undefined,
	      constructor: Woman,
	      name: undefined,
	      seelp: ƒ(),
	      __proto__: Object
    }
}

寄生组合继承

原理:
子类的原型不再是父类的实例,而是空类,空类的原型指向父类的原型,
优点:

可像父类传递参数
可实现多继承
非原型属性继承
原型属性继承

function Woman(name,age){
  //继承父类属性
  People.call(this,name,age)
}
//继承父类方法
(function(){
  // 创建空类
  let Super = function(){};
  Super.prototype = People.prototype;
  //父类的实例作为子类的原型
  Woman.prototype = new Super();
})();
//修复构造函数指向问题
Woman.prototype.constructor = Woman;
var personal = new Woman('小刘鸭',27)
personal = {
	age: 27,
    name: "小刘鸭",
    seelp: ƒ(),
    __proto__: {
    	constructor: Woman(name, age),
        __proto__: {
        	eat: ƒ(),
          	constructor: People(name, age),
          	__proto__: Object
        }
   }
}

你可能感兴趣的:(面试题,JavaScript,ES6)