原型,继承和原型链

继承 首先明确一点:只有在对象里面才会有proto,指向其构造函数

let b=new Ball() console.log(b.proto===Ball.prototype);

综合重点整理ES5,ES6里面的原型链问题

1.在es5里面,还没有类的概念,所以在函数的prototype上添加方法来当做类用,这个函数就成了构造函数,这时候使用new就可以获得一个包含有原函数所有方法和属性的对象,new出来的就是实例化对象,所以在es5里面 函数名.prototype得到的就是设置在这个函数上的方法和属性。proto是只有在对象里面才有的,但是万物皆对象,所以基本上所有的数据类型和HTML标签都有proto属性,proto指向所属构造函数的prototype,这一点在es6里面也是如此。

在es6里面,引入了一个新的概念,类,类相当于es5里面的构造函数,也是通过new获得实例化对象,实例化对象身上就会有类里面的属性和方法,而且在es6里面constructor就是构造函数,就是类,这三个概念是一个东西。所以原来的在es5里面使用prototype添加方法就相当于在es6里面直接写在类里面, 类.prototype 就是他自己本身。实例化对象proto指向所属类的prototype就是这个类本身。

2.原型链:在es5里面没有类的时候,方法和属性写在构造函数的prototype里面,而构造函数的prototype也是一个对象且就是构造函数本身,也有一个自己的proto,指向创建函数的Function。构造函数本身也是一个对象,就有proto,但是,构造函数本身就是构造函数的prototype。而FUNCTION也是一个对象也有proto,就会指向最终的构造函数Object,顶级对象。而子类可以顺着这一条proto所连接起来的所有父类上面的方法和属性,这一条链接各种函数和对象的链式结构就是原型链。

在es6里面引入类之后,类就是constructor,相当于构造函数,类的prototype就是自己本身,类会进行继承,而继承之后,就会在子类上面有父类的方法和属性,类.proto就是它的父类的构造函数也就是父类本身。一直顺着proto向上寻找父类里面方法和属性的链式结构就是es6的原型链。

实例化对象,构造函数,原型。实例化对象:由构造函数new出来的对象,在ES6里面就是new出来的类。构造函数:这个概念是ES5的概念,构造函数实际上就是ES6里面的类,可以说类就是构造函数演化来的。原型:这个概念是ES6里面的,指的是类.prototype也就是类本身。

1.原型继承:直接把父类的实例化对象当做子类的prototype,利用改变原型链的方式来达到继承效果。优点:构造函数内部和原型上的属性和方法都可以继承。缺点:继承来的属性不在子类实例的身上。

2.借用继承:在子类构造函数内部,使用父类.call(子类的实例)通过改变父类的构造函数的this指向来达到继承的效果。优点:继承来的属性在自己身上。缺点:只能继承父类构造函数体内的内容,而且父类原型上的内容不能继承。

3:组合继承(原型链继承):把父类的实例化对象当做子类的prototype,并且在子类构造函数内部,使用父类.call(子类的实例)改变父类的构造函数的this指向。优点:父类构造函数内部和原型上的内容都可以继承,而且继承下来的属性都可以放在自己身上。缺点:当在给子类添加方法的时候,实际上是添加在了父类的实例身上,无法给子类添加新的方法和属性。

4.伪继承:直接将父类的prototype赋值给子类的prototype。优点:原型和构造函数内部的属性和方法都可以继承下来,而且子类本身的方法和属性仍然可以正常的添加和使用。

5.寄生式组合继承(寄生继承):让第三方构造函数来寄生父类的原型,在子类构造函数内部使用父类.call(子类的实例)改变父类的构造函数的this指向。完美继承,没有缺点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值