JavaScript 的 prototype、__proto__与constructor

prototype:显式原型,__proto__: 隐式原型

constructor

constructor 属性返回对创建此对象的数组函数的引用,格式:object.constructor

*constructor属性的含义就是指向该对象的构造函数,所有函数(此时看成对象了)最终的构造函数都指向Function。

__proto__

*__proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null,然后返回undefined,再往上找就相当于在null上取值,会报错。通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链。

prototype

prototype 属性允许向对象添加属性和方法,格式:object.prototype.name=value

原型属性(prototype),这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)。原型对象也有一个属性,叫做constructor,这个属性包含了一个指针,指回原构造函数。

*prototype属性的作用就是让该函数所实例化的对象们都可以找到公用的属性和方法,即f1.__proto__ === Foo.prototype。

总结一下:

我们需要牢记两点:①__proto__和constructor属性是对象所独有的;② prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__和constructor属性。

js 一切都可以看作是对象,方法也是对象, prototype 也是对象,既然是对象,那么就也有 __proto__

 

 

如何看这个图?
首先纵向 3 列:
第一列:创建的对象实例。包括 Foo, Object 创建的
第二列:提到三个函数,Foo, Object, Function
第三列:函数的 prototypes

第二列,第三列之间的关系一目了然:
Foo.prototype === Foo.prototype
Foo.prototype.constructor === Foo
Object, Function 同理

第一列,第二列之间的关系,就是实例是由构造函数 new 出来的,其它函数是由 Function 构造出来的,包括 Foo,Object.

第一列,第三列关系, 上面都有讲到:
实例作为对象:
f1.[[proto]] === Foo.prototype
o1.[[proto]] === Object.prototype

上面讲到:
构造函数的 [[proto]] === Function.prototype, 包括 Function 自身
所以:
Foo.[[proto]] === Function.prototype
Object.[[proto]] === Function.prototype
Function.[[proto]] === Function.prototype

prototype 作为一个对象,那么它的构造函数就是 Object. 所以:
Foo.prototype.[[proto]] === Object.prototype
Function.prototype.[[proto]] === Object.prototype
最后,到顶了:
Object.prototype.[[proto]] === null
提醒: Object.[[proto]] === Function.prototype

 

 

 

 

 

https://blog.csdn.net/cc18868876837/article/details/81211729

https://segmentfault.com/a/1190000015642813

https://www.jianshu.com/p/13d83fed5f00

https://www.jianshu.com/p/686b61c4a43d

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值