原型链之__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
以上皆为个人理解,如有错误之处,欢迎留言指正。


浙公网安备 33010602011771号