原型链之__proto__ 与prototype的区别

先说结论

1.我们创建的每个函数都有一个prototype(原型)属性(除了Function.bind()返回的函数)
function A(){} A.prototype={ constructor: A, ... }
2.__proto__是用来访问对象的原型的, (方法).__proto__访问到的是方法作为对象时的原型,而非作为构造方法的原型
3.prototype 是用来访问方法作为构造方法时的原型
4.对象的原型是指向其构造方法的原型
5.原型链的顶端是 Object.prototype

根据结论理解现象

1.方法是一种特殊对象

function A() {}
const a = new A()
A.constructor == Function //true

js 中一个 function 也可以看作一个对象,所以它也有构造方法(即 Funtion);
再结合上面结论,得出

 a.__proto__ == A.prototype  //true
 A.__proto__ == Funtion.prototype //true  此处把A看作对象便很容易理解

所有方法(包括 Function 本身)的的构造方法都是 Funtion,得出

(任意方法).__proto__ == Funtion.prototype
Funtion.__proto__ == Funtion.prototype

编码时,通常我们都不需要访问方法作为对象时的原型, 只需要通过 prototype 访问其作为构造方法的原型

2.原型链顶端
原型链的顶端是 Object.prototype 对象, Object.prototype 的原型指向哪呢?对象的原型通过__proto__来访问, 最终指向null

a.__proto__.__proto__ == Object.prototype  // true  
A.prototype.__proto__ == Object.prototype  // true 默认的A.prototype是一个普通空对象
Function.prototype.__proto__ == Object.prototype  // true
Object.prototype.__proto__ == null // true

以上皆为个人理解,如有错误之处,欢迎留言指正。

附掘金盗来图

posted @ 2021-10-08 17:15  会潮  阅读(255)  评论(0)    收藏  举报