JS中的继承

原型链继承

   原型链继承就是让子类的prototype指向父类的实例。


    再让prototype的constructor重新指向它关联的构造函数。用来补全原型(prototype),每个prototype原型都有一个constructor属性,指向它关联的构造函数。


     后面我们又通过子类的prototype,写了一个公有的方法。


     然后通过new出来的子类的实例可以获取自己的私有属性和方法。并且每个实例对象都有一个__proto__属性,指向自身构造函数的prototype。


    但在上面我们让子类的prototype重新指向了父类的实例。就等于把父类的实例当成子类的prototype。父类的实例上有自己的私有属性和方法。


     我们就可以通过子类的显示原型prototype获取到父类的私有属性和方法。


     父类的实例有一个__proto__指向父类的prototype,父类的prototype上有父类的公有属性和方法,我们就可以通过原型链查找到父类的公有属性和方法。父类的prototype,有一个__proto__指向object.prototype。

call继承

在子类构造函数中把父类构造函数当作普通的函数执行, 并且通过call方法把父类构造函数中的this替换成子类的实例(this), 这样相当于给子类实例设置了私有的属性和方法.

 

特点:

     1.只能继承父类私有的属性和方法(因为只是把父类构造函数当作普通函数执行了一次,跟父类的原型上的方法和属性没有任何关系)

     2.父类的私有的属性和方法 都会变成子类私有的属性和方法

组合继承

就是结合原型链继承和借用构造函数继承组合起来实现的继承

 

特点:
    (call继承

      1.子类实例可以使用父类私有的属性和方法

      2.父类私有的属性和方法都会变成子类实例私有的属性和方法

    (原型链继承

      3.子类实例可以通过原型链访问和使用父类公有的属性和方法

      4.子类的原型链上会存在一份多余的父类的私有属性和方法

      (原型链上为什么会存在一份多余的父类的私有属性和方法

     原因:

     因为本身在子类构造函数上我们用了call继承,在new 子类的实例的时候我们就会得到一份父类的私有属性和方法。但我们又让父类的实例子类赋值给了子类的显示原型prototype,在父类的实例也有一份父类的私有属性和方法。所以就会在原型链上多一份数据。


寄生组合继承

结合原型链继承和call继承的方法,同时自己创建一个对象,并且让这个对象的原型指向父类构造函数的prototype.实现寄生组合继承

特点:

     1.最完美的js继承解决方案

     2.父类私有的属性和方法,成为子类实例私有的属性和方法

     3.父类公有的属性和方法,成为子类实例公有的属性和方法

   

ES6中的Class继承

ES6引入了Class(类)这个概念,通过class关键字可以定义类。该关键字的出现使得其在对象写法上更加清晰,更像是一种面向对象的语言。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值