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