JS中的_proto_和prototype

JS中的_proto_和prototype

对象的内部原型__proto__和构造器的原型prototype

每个对象都有__proto__属性来标识自己所继承的原型
但是只有函数才有prototype属性(ES规范就这么定的)。

因为JS没有类因此通过函数来模拟类。当你创建函数时,JS会为这个函数自动添加prototype属性,prototype的值是一个有 constructor 属性的对象,切记不是空对象。而当这个函数被作为构造函数调用(即通过new来创建一个实例)时,JS会帮你创建该构造函数的实例(例如var d=new People(), 此时People()函数被作为构造函数创建了一个实例,而JS会帮你完成new People()的过程),实例继承了构造函数的prototype(其实是生成了指向其构造函数的prototype的指针_proto_

上图中首先创建了一个构造函数People然后创建了实例p,打印出实例p的结果如下图所示

打印出People.prototype的结果如下图所示
在这里插入图片描述
可以发现实例p的_proto_是指向constructor 的prototype,意思就是实例p的内部原型指向的就是它的构造函数People的原型。

再讲一下Function和Object的关系
在这里插入图片描述
上图可以首先清晰的看到Function.prototype.__proto__===Object.prototype
Object.prototype.__proto__ === null,说明Object.prototype是原型链顶端

最后,借用一下https://github.com/creeperyang/blog/issues/9,说明比较难理解的两点:
一 .Function.prototype是个不同于一般函数(对象)的函数(对象)。

  1. Function.prototype像普通函数一样可以调用,但总是返回undefined
  2. 普通函数实际上是Function的实例,即普通函数继承于Function.prototype。func.__proto__ ===Function.prototype
  3. Function.prototype继承于Object.prototype,并且没有prototype这个属性。func.prototype是普通对象,Function.prototype.prototypenull
  4. 所以,Function.prototype其实是个另类的函数,可以独立于/先于Function产生。

二 .Object本身是个(构造)函数,是Function的实例,即Object.__proto__就是Function.prototypeObjectFunction.prototype这实际上就是鸡和蛋的问题

最后总结:先有Object.prototype(原型链顶端),Function.prototype继承Object.prototype而产生,最后,FunctionObject和其它构造函数继承Function.prototype而产生。
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值