原型链之prototype、_proto_与继承

咱们先看一个例子:

var a=new Date();
a.__proto__===Date.prototype  //true
a.constructor===Date  //true
//所以可得
a.constructor.prototype===Date.prototype   //true

从上面的例子我们就可以清晰看出对象和函数的关系。简单理解:每次new都可以看做一次构造,new的函数就是构造函数,new之后的函数就是被构造的函数,由于他被构造,所以他的隐式原型链_proto_就是他的构造函数的显式原型。

形象化就是这个意思:上例的Date是父亲,new就是一个创造的过程,他创造出a这个儿子。constructor可以理解为谁创造了他,所以a.constructor===Date。父亲有很多财产,他的财产就是prototype,a没有财产,但是默认a会继承父亲的财产,由于这个继承不是明显的,所以就是隐式原型_proto_。a赚钱了,他要给父亲用,但是在显式原型链上只有父亲给儿子东西没有儿子给父亲的道理,这个时候就需要用隐式原型链,儿子可以通过使用a._proto_.fangfa=function(){}的方式给父亲“尽孝”,但是并不推荐这样做,因为这样会间接性给其他兄弟这份“财产”,当然如果是独生子的话我无话可说。

当a被实例化的时候,他会继承父类的constructor。这个constructor就是继承的父类本身,函数的_proto_就是父类的prototype。

prototype是函数的原型对象,他又有_proto_和constructor,他的constructor指向父类函数,他的_proto_指向父类函数的prototype原型对象。

任何子类如果要用a._proto_.fangfa=function(){}来创建一个函数方法的时候,都会默认给父类创建一个方法。所以咱们如果是子类私有的方法就要避免这样写。直接a.fangfa=function(){}。

constructor是对象指向函数,这个函数可能是继承来的,也有可能是自己本来就有的。但是他们的终点都是Function,这里要理解,Function它不只是一个函数,还是一个对象,所以Function的constructor是指向了它本身。

这里的知识很复杂,但是一个图就可以直观看出来。链接:https://blog.csdn.net/cc18868876837/article/details/81211729

使用实例的__proto__属性改写原型,必须相当谨慎,不推荐使用,因为这会改变“类”的原始定义,影响到所有实例。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值