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

2022-07-26 08:46:16

有如下父类

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}}}
  • 作者:大刘鸭
  • 原文链接:https://blog.csdn.net/xiao_yu_liu/article/details/107078801
    更新时间:2022-07-26 08:46:16